首页 > 解决方案 > 索引可以用于聚合计算吗?

问题描述

索引可用于执行以下操作:

SELECT name FROM bigtable GROUP BY name

也就是说,它可以遍历 btree 或任何索引结构来获取值。但是,索引对这样的事情有帮助吗?

SELECT name, count(1) FROM bigtable GROUP BY name

请注意,出于此问题的目的,不会应用过滤器或排序。

我的想法是它不会因为需要表扫描(无论是否有索引)来“总结”所有值。这是正确的,还是我在这里遗漏了什么?索引对聚合计算有用吗?如何或如何不?

除了预先存储这些值之外,还有什么方法可以加快这些值的计算速度,或者这实际上只是磁盘速度的问题。

标签: sqlsql-serverdatabase

解决方案


我的想法是它不会因为需要表扫描(无论是否有索引)来“总结”所有值。

不,您也可以只扫描索引。它包含(在您的示例中)每行及其name列值的条目。

与表格不同的是,索引已经按 分组/排序name,因此不需要额外的排序步骤。如果您尝试使用全表扫描来执行此操作,则需要大量内存或临时空间来运行每个名称的计数器。

第二部分在这里有很大的不同(扫描整个索引比扫描整个表更快,这当然也是如此,因为它更小并且可能已经缓存)。

您应该能够通过查看执行计划轻松地验证这一点。

请注意,出于此问题的目的,不会应用过滤器或排序。

如果您确实引用了查询中的其他列,则索引不再是“覆盖索引”并且不能再(单独)用于满足查询。


推荐阅读