1

想象富表对可乐COLB上COLC NO指标非聚集索引,冷可以在同一个表中包含列到SELECT中减慢查询速度?

SELECT colA, colB 
FROM Foo 

需要约30秒

SELECT colA, colB, colC, colD 
FROM Foo 

需要约2分钟

Foo表有超过500万行。

问题: 包含不属于索引一部分的列可能会减慢查询速度吗? 如果是,为什么? - 他们不是已经阅读过的页面的一部分吗?

回答

4

如果您编写使用covering index的查询,则不会访问堆/聚簇索引中的完整数据页。

如果随后向查询中添加更多列以使索引不再覆盖,则会发生其他查找(如果索引仍在使用中),或者完全强制使用不同的数据访问路径(例如使用表扫描而不是使用索引)


自2005年以来,SQL服务器已经支持包含的列的概念在index。这包括索引叶中的非键列 - 因此它们在索引使用的数据查找阶段没有用,但仍有助于避免在堆/聚簇索引中执行额外的查找,足以使该指数成为覆盖指数。


此外,在未来,如果你想获得一个原因是查询速度快更好的理解,另一个是缓慢的,看看发生Execution Plans,然后你就可以进行比较。

即使你不理解所使用的术语,你应该至少能够在它们之间玩“点差”,然后在条件(如表扫描,索引查找,或查找)

搜索
0

简单的答案是:因为非聚集索引不会与数据存储在同一页面中,所以SQL Server必须查找实际数据页以获取其余数据。

非聚簇索引存储在单独的数据结构中,而聚簇索引存储在与实际数据相同的位置。这就是为什么你只能有一个聚集索引。