23

为正在求和的列创建索引是否比没有索引快?

4

5 回答 5

45

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

你在问,它会加快查询,如

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

如果您添加了数量索引?

如果这是问题,那么答案是否定的。一般来说,当您需要在众多行中查找几行时,索引会很有帮助;在这里您需要所有行,因此索引无济于事。

有一个晦涩的异常(很少适用,大多数数据库优化器可能不会费心实现这个技巧)。如果您的查询恰好是

SELECT sum(foo) FROM bar

,其中 foo 上有一个索引,而 bar 是一个包含许多列的表,则可以读取完整索引,与读取基础表相比,会产生较小的命中,并直接从索引中获得答案——根本不必碰“真实”的桌子!然而,这是一种相当罕见的情况,您需要测试您的优化器是否知道这样做,然后再过分依赖它。

于 2009-01-13T04:03:35.833 回答
11

不会。索引通过限制需要的检查次数来改进搜索。无论如何,聚合函数(count、max、min、sum、avg)必须遍历列中的所有条目。

于 2009-01-13T03:59:34.127 回答
5

如果你想让求和更快,你可以预先实现结果。在 Oracle 上,使用Materialized Views,在 MS SQL 上使用Indexed Views

关于您的具体问题“是否为正在求和的列创建索引比没有索引快?”,答案是否定的。

您的问题的答案在于斯宾塞的回答:

“无论如何,聚合函数(count、max、min、sum、avg)必须遍历列中的所有条目。”

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

于 2009-01-13T04:15:57.260 回答
0

如果索引覆盖,通常会更快。快多少取决于表中列数与索引中列数之间的差异。此外,如果有任何过滤条件,它可能会更快。

于 2009-01-13T07:42:04.473 回答
0

我发现在使用此查询时在 where(productid here) 中对列进行索引会有所帮助:

从收据中选择 productid, sum(quantity) WHERE productid = 1 GROUP BY productid

添加索引后,我的一个查询从 45 秒变为几乎即时。

于 2009-05-19T22:14:02.097 回答