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必須查找實際數據頁以獲取其餘數據。

非聚簇索引存儲在單獨的數據結構中,而聚簇索引存儲在與實際數據相同的位置。這就是爲什麼你只能有一個聚集索引。