Sql-Server

為什麼使用覆蓋索引的讀取性能比使用主鍵更好?

  • September 14, 2021

我有這個表,只有 Id 和 Value 列,它被連接起來以獲取常見查詢中的值。Id 是(聚集的)主鍵,在選擇中讀取值列。如果我在 Id 上添加一個新的非聚集索引並包含 Value 列,SQL sentry 會給索引一個更好的分數,這反映在重新執行查詢時讀取和總時間的減少。

據我了解,主鍵本質上只是一個索引,它包含來自其他列的所有數據,但不被它們索引。有人可以解釋為什麼這與創建非聚集索引(包括其他欄位)相比有性能差異嗎?如果有的話,我希望它的性能更好,因為它是集群的,所以它是按 ID 排序的。我一定是在這裡誤解了一些東西,所以任何輸入都將不勝感激。

SQL Sentry 索引分析


編輯:當試圖找到最小的可重現範例時,我無法複製它,所以我回到原始查詢,它與許多回复所說的一致。一方面,SQL Sentry 的評分算法優先考慮非聚集索引,另一方面,隨著時間的推移和使用,它們會產生相同的性能輸出。

我有這張表,只有 Id 和 Value 列。. . Id 是(聚集的)主鍵,在選擇中讀取值列。如果我在 Id 上添加一個新的非聚集索引並包含 Value 列,

這兩個索引將是相同的:一個 BTree on Id,所有(Id,Value)元組在Id葉子頁面上都按 -order 排列。IE 的非聚集索引將是聚集索引的精確副本。

但是,新的非聚集索引最初會進行碎片整理,並且可能佔用更少的頁面。隨著時間的推移,它們將是相同的。

引用自:https://dba.stackexchange.com/questions/299510