Index
為什麼 DTA 推薦匹配聚集主鍵索引的非聚集索引?
我只是模糊地熟悉 SQL Server 的數據庫引擎優化顧問 (DTA),但我使用它來為我的數據庫上的索引提供建議。
目前數據庫中的大多數表都有一個索引,即主鍵。它在表的創建過程中定義為:
CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED ([ID] ASC)
當 DTA 執行時,建議我在一些只包含
$$ ID $$列,例如:
CREATE NONCLUSTERED INDEX [_dta_index_Employee_18_1170844725__K1] ON [dbo]. [Employee] ( [ID] ASC )WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
我想知道為什麼它建議我創建一個與已經存在的索引完全匹配的索引。有一個非聚集索引和聚集索引對查詢優化器有什麼好處嗎?
對於它的價值,在大多數情況下
$$ ID $$列也是
IDENTITY
列。
索引與已經存在的不完全匹配。聚集索引(主鍵)包含與表相關的所有其他數據。但是非聚集索引 (NCI) 只包含主鍵。生成的 NCI 比聚集索引窄得多。
僅在主鍵上使用非聚集索引有一些在這裡可能相關的好處。但是,我也想提醒您對 DTA 和建議的缺失索引持保留態度。
除了聚集索引(在同一個鍵上)之外,還有一個非聚集索引的好處。
- 外鍵檢查約束——如果其他表使用這個作為外鍵引用,那麼使用窄 NCI 將大大加快這一速度。
- COUNT 或 EXISTS - 如果您在沒有任何其他條件的情況下經常檢查該值是否存在(或計算它們),那麼擁有 NCI 也將是有益的。為這些使用更窄的索引非常有效,尤其是在基表非常寬的情況下。
基本上,即使兩者都是查找操作,如果可以使用 NCI,它通常會非常窄,並且可以在磁碟上每頁容納更多的 ID 值,因此會減少記憶體授予。