2009-01-13 53 views

回答

40

对不起,你不清楚你在问什么。

你是问,如果添加数量上的指标,将加快这种查询的

SELECT product, sum(quantity) FROM receipts 
GROUP BY product 

如果这是问题,那么答案是否定的。一般来说,当你需要在很多行中找到几行时,索引是有帮助的;在这里你需要所有的行,所以索引没有帮助。

有一个模糊的异常(很少适用于大多数数据库优化器可能不会执行此技巧)。如果查询恰好是

SELECT sum(foo) FROM bar 

,那里是于foo的一个指标,酒吧是很多列的表,可以在完整的索引读取,招致比如果你读了一个较小的命中底层表,并直接从索引中获得答案 - 根本不必触摸“真实”表!然而,这是一个相当少见的情况,你需要测试你的优化器是否知道这么做,然后才依赖于这个。

+1

+1的情况快,因为这是索引的一个有趣用法。 – NotMe 2009-01-13 04:05:24

+1

+1好建议:查看优化器生成的执行计划。 – 2009-01-13 04:24:56

7

编号索引通过限制需要多少次检查来改善搜索。无论如何,汇总函数(count,max,min,sum,avg)都必须遍历列中的所有条目。

+0

但是,如果所有这些列都出现在索引本身中,则无需访问实际表格,从而使得总和比没有索引 – 2017-07-20 06:29:57

4

如果您希望加快求和速度,可以预先实现结果。在Oracle上,使用Materialized Views,在MS SQL上使用Indexed Views

您的具体问题“是创造正被总结一列的索引比没有索引快?”,答案是否定的

的回答你的问题在于对斯宾塞的回答是:

“汇总函数(计数,最大值,最小值,总和,平均值)必须遍历列中的所有条目进行求和,无论如何。”

刚刚澄清了斯宾塞答案中列的上下文。尽管如此,他的回答是正确的。

0

如果索引覆盖,它通常会更快。表格中的列数与索引中的数字之间的差异将决定更快的速度。另外,如果有任何过滤标准,它可能会更快。

0

我发现索引使用此查询时,在其中一列(这里的ProductID)帮助:

SELECT的ProductID,SUM(数量)收到来自WHERE的ProductID = 1 GROUP BY的productid

我的一个查询一旦我添加索引,就从45秒变为几乎瞬间。