Sql-Server
將主鍵指定為非聚集索引中的包含列有什麼區別嗎?
非聚集索引是否固有地儲存對錶上主鍵的引用,以便它可以根據需要進行鍵查找?…如果是這樣,將主鍵指定為包含列時的性能是否會降低或提高?創建非聚集索引?
附帶問題,為什麼非聚集索引預設儲存主鍵而不是聚集索引欄位來對錶進行鍵查找?…在主鍵不是聚集索引的情況下,它不是更慢進行鍵查找,而如果它儲存了聚集索引,它可以以這種方式進行查找嗎?
非聚集索引包含返回基表的行定位器。
這是具有聚集索引的行儲存表的聚集索引鍵或堆的物理 RID(文件/頁面/槽)。
因此,假設它使用主鍵(如果它們不同)的問題中的部分沒有實際意義。
行定位器被添加到非唯一非聚集索引的鍵中,並作為包含列添加到聲明為唯一的非聚集索引中。
為這種
included
情況明確指定它沒有性能優勢。對於它被隱式添加到鍵的情況,如果您的查詢將受益於與隱式給您不同的asc
/desc
方向或多列排序,則您可能需要顯式執行此操作。對於不熟悉隱式行為的開發人員,或者如果您的查詢仍然需要索引中的這些列,即使將來聚集索引定義發生變化,您可能更願意明確說明它。
關於評論中的後續問題
這是否意味著如果主鍵在選擇列表中,則可以從主鍵的非聚集索引(當主鍵不是聚集索引時)執行鍵查找?
是的,您可以在下面看到這一點。
CREATE TABLE #T ( PK INT PRIMARY KEY NONCLUSTERED, CI INT INDEX CIX CLUSTERED, OtherCol INT INDEX NCIX NONCLUSTERED ) SELECT * FROM #T WITH (FORCESEEK) WHERE OtherCol = 10
- seek on 的輸出列表
NCIX
是Uniq1001, CI, OtherCol
- 然後查找使用的值
CI, Uniq1001
來尋找聚集索引……PK
…並且從該查找返回的值。如果您想知道
Uniq1001
這是由系統靜默添加的聚集索引鍵的一部分,以充當唯一符,因為聚集索引未聲明為唯一。它是空的,除了值重複存在/存在的行CI
。