Sql-Server
非聚集主鍵和聚集索引
據我了解,在 SQL Server 中,您可以擁有一個非集群的主鍵,並擁有另一個集群索引。
對我來說,這似乎與只有一個主鍵和一個額外的唯一鍵相同。
所以我有兩個問題:
- 如果主鍵是非集群的,它會儲存所有列嗎?還是只有主鍵列和引用聚集索引的列?
- 我剛剛讀到,如果 PK 不是聚集索引,那麼聚集索引不必是唯一的(但強烈建議這樣做)。這是否意味著表可以在具有相同鍵的行上“隨機排序”?
如果主鍵是非集群的,它會儲存所有列嗎?
不,這是聚集索引的特性,而不是主鍵。非聚集主鍵將只儲存它所定義的欄位以及聚集索引的鍵欄位。
…聚集索引不必是唯一的(但強烈建議這樣做)。這是否意味著表可以在具有相同鍵的行上“隨機排序”?
表的行將始終按聚集索引欄位進行邏輯排序。在聚集索引不是唯一的情況下,並且有兩行具有相同的聚集索引鍵值,這些行被賦予一個唯一的行標識符,該標識符儲存在幕後(這個 4 字節的唯一標識符僅添加到重複的鍵行)。這是它們相對於彼此排序的決定因素。
人們可能選擇將主鍵設為非聚集索引的一個原因是,他們發現數據的邏輯排序方式不同於標識行唯一性的欄位(無論聚集索引是否唯一),從而帶來性能優勢。
例如,如果在
UNIQUEIDENTIFIER
列中使用 GUID 作為表的主鍵。GUID 非常適合唯一性(大多數時候),但通常不是保持數據排序的好方法,因為它們的值類似於隨機值。相反,您可能在該表中有一組自然的欄位,您的查詢通常會加入或過濾這些欄位,不一定保證是唯一的,這反而會產生良好的聚集索引。甚至您通常在查詢中排序的一組欄位也可能是聚集索引的候選者,以消除查詢計劃中的繁重排序操作。然後,數據將按有意義的順序排序,而不是按 GUID 的半隨機值排序。有關聚集索引如何工作的更多資訊,請參閱帶有範例的 SQL Server 聚集索引內部結構。