想象一下 Foo表在ColA和ColB上有非聚集索引 和没有关于ColC的指数,ColD
SELECT colA, colB
FROM Foo
约30秒。
SELECT colA, colB, colC, colD
FROM Foo
约2分钟。
Foo表有超过500万行。
问题: 是否包含不属于索引的列可能会降低查询速度? 如果是,为什么? - 它们不是已经读过的PAGE的一部分吗?
答案 0 :(得分:4)
如果您编写的查询使用covering index,则不会访问堆/聚簇索引中的完整数据页。
如果您随后向查询添加了更多列,以便索引不再覆盖,则会发生其他查找(如果仍使用索引),或者您完全强制使用不同的数据访问路径(例如使用表扫描而不是使用索引)
自2005年以来,SQL Server在index中支持包含列的概念。这包括索引叶子中的非键列 - 因此在索引使用的数据查找阶段它们没有用,但仍然有助于避免在堆/聚簇索引中执行额外的查找,如果它们'足以使指数成为覆盖指数。
此外,将来,如果您希望更好地了解为什么一个查询速度快而另一个查询速度慢,请查看生成Execution Plans,然后您可以进行比较。
即使您不理解所使用的术语,您至少应该能够在它们之间“发现差异”,然后搜索术语(例如表扫描,索引搜索或查找)
答案 1 :(得分:0)
简单的答案是:因为非聚集索引不与数据存储在同一页面中,所以SQL Server必须查找实际数据页以获取其余数据。
非聚集索引存储在单独的数据结构中,而聚簇索引存储在与实际数据相同的位置。这就是为什么你只能有一个聚集索引。