为正在求和的列创建索引是否比没有索引更快?
答案 0 :(得分:41)
抱歉,目前尚不清楚你在问什么。
您是否在问,是否可以加快查询,例如
SELECT product, sum(quantity) FROM receipts
GROUP BY product
如果您在数量上添加了索引?
如果这是问题,那么答案是否定的。一般来说,当你需要在众多行中找到几行时,索引是有用的;这里你需要所有行,所以索引没有帮助。
有一个模糊的异常(很少适用,大多数数据库优化器可能都不会执行这个技巧)。如果您的查询恰好是
SELECT sum(foo) FROM bar
,foo上有一个索引,bar是一个包含很多列的表,可以读入完整的索引,比你读取基础表时产生更小的命中,并直接从index - 永远不必触摸“真实”表格!但是,这是一种非常罕见的情况,您需要测试优化器是否知道在依赖此操作之前执行此操作。
答案 1 :(得分:9)
没有。索引通过限制需要检查的次数来改进搜索。无论如何,聚合函数(count,max,min,sum,avg)都必须遍历列中的所有条目。
答案 2 :(得分:5)
如果要更快地求和,可以预先实现结果。在Oracle上,使用Materialized Views,在MS SQL上使用Indexed Views。
关于您的具体问题“正在为正在求和的列创建索引是否比没有索引更快?”,答案为否。
你的问题的答案取决于斯宾塞的答案:
“聚合函数(count,max,min,sum,avg)必须遍历要求总和的列中的所有条目。”
刚刚澄清了Spencer答案中的专栏背景。尽管如此,他的回答是正确的。
答案 3 :(得分:0)
如果索引覆盖,通常会更快。表格中的列数与索引中的数字之间的差异将确定多快。此外,如果有任何过滤标准,它可能会更快。
答案 4 :(得分:0)
我在使用此查询时发现在where(productid here)帮助中索引列:
SELECT productid,sum(quantity)FROM receipts WHERE productid = 1 GROUP BY productid
我添加索引后,我的一个查询从45秒变为几乎即时。