Sql-Server

複合或單欄位分群鍵

  • December 15, 2011

我的 DBA 和我在索引結構上存在分歧。

考慮醫療索賠的數據…

我們的Header表格包含以下欄位:

ClaimId (varchar(50)), PaidAmount, MemberID...

對於每個標題,我們都有一個或多個記錄,Detail例如:

ClaimId (varchar(50)), LineNumber (smallint), MemberId...

資料結構或重複的效率超出了這個問題的參數。

還有一些額外的表格通過,我們經常和on連接到各個Detail行。ClaimId, LineNumber``JOIN Detail``Header``ClaimId

對於Detail表,這對於聚集索引鍵更可取:

ClaimId

要麼

ClaimId, LineNumber

ClaimId單獨不是唯一的,但組合ClaimId, LineNumber是唯一的Detail記錄。

我們中的一個人認為,ClaimId單獨是一個更好的聚集鍵,因為它更窄,並且查找將同樣有效,因為我們需要ClaimId在查找之前知道LineNumber.

另一個認為兩者結合更好,因為它不需要額外的RowID,並且可以用於JOIN需要LineNumber作為JOIN條件的支持表。

這是胡說八道:

… ClaimId 單獨是一個更好的集群鍵,因為它更窄

因為這

單獨的 ClaimId 不是唯一的

非唯一聚集索引將添加一個 4 字節的唯一性以消除 ClaimId 的歧義,因為它是聚集索引。為什麼?一個原因是所有 NC 索引都引用它:那麼如何知道 ClaimId 是哪個?

已經證明(前一段時間,現在可能無效並且找不到它)當您耗盡 4 字節唯一標識符的 2^32 個值時,非唯一聚集索引會中斷

編輯 :

問題狀態 ClaimId不是唯一的,因此假設存在 uniqifier。無需評論它可能不存在於問題的上下文中

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