索引可用于汇总计算吗?

问题描述 投票:0回答:1

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

SELECT name FROM bigtable GROUP BY name

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

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

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

我想这不是因为需要进行表扫描(无论是否有索引)来“汇总”所有值。这是正确的,还是我在这里遗漏了一些东西?索引对汇总计算有用吗?如何或如何?

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

sql sql-server database
1个回答
1
投票

我想这不是因为需要进行表扫描(无论是否有索引)来“汇总”所有值。

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

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

第二部分是在这里产生巨大差异的地方(与其说是扫描整个索引比扫描整个表要快,不如说是正确的,因为它较小并且可能已经被缓存了,所以当然也是如此)

您应该能够通过查看执行计划轻松地对此进行验证。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.