Sql-Server

非聚集主鍵和聚集索引

  • May 17, 2022

據我了解,在 SQL Server 中,您可以擁有一個非集群的主鍵,並擁有另一個集群索引。

對我來說,這似乎與只有一個主鍵和一個額外的唯一鍵相同。

所以我有兩個問題:

  1. 如果主鍵是非集群的,它會儲存所有列嗎?還是只有主鍵列和引用聚集索引的列?
  2. 我剛剛讀到,如果 PK 不是聚集索引,那麼聚集索引不必是唯一的(但強烈建議這樣做)。這是否意味著表可以在具有相同鍵的行上“隨機排序”?

如果主鍵是非集群的,它會儲存所有列嗎?

不,這是聚集索引的特性,而不是主鍵。非聚集主鍵將只儲存它所定義的欄位以及聚集索引的鍵欄位。

…聚集索引不必是唯一的(但強烈建議這樣做)。這是否意味著表可以在具有相同鍵的行上“隨機排序”?

表的行將始終按聚集索引欄位進行邏輯排序。在聚集索引不是唯一的情況下,並且有兩行具有相同的聚集索引鍵值,這些行被賦予一個唯一的行標識符,該標識符儲存在幕後(這個 4 字節的唯一標識符僅添加到重複的鍵行)。這是它們相對於彼此排序的決定因素。

人們可能選擇將主鍵設為非聚集索引的一個原因是,他們發現數據的邏輯排序方式不同於標識行唯一性的欄位(無論聚集索引是否唯一),從而帶來性能優勢。

例如,如果在UNIQUEIDENTIFIER列中使用 GUID 作為表的主鍵。GUID 非常適合唯一性(大多數時候),但通常不是保持數據排序的好方法,因為它們的值類似於隨機值。相反,您可能在該表中有一組自然的欄位,您的查詢通常會加入或過濾這些欄位,不一定保證是唯一的,這反而會產生良好的聚集索引。甚至您通常在查詢中排序的一組欄位也可能是聚集索引的候選者,以消除查詢計劃中的繁重排序操作。然後,數據將按有意義的順序排序,而不是按 GUID 的半隨機值排序。

有關聚集索引如何工作的更多資訊,請參閱帶有範例的 SQL Server 聚集索引內部結構。

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