复合或单字段聚类键

JNK*_*JNK 6 index sql-server-2008 sql-server clustered-index

我和我的 DBA 在索引结构上存在分歧。

考虑医疗索赔的数据...

我们有Header包含以下字段的表:

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

对于每个标题,我们都有一个或多个记录,Detail例如:

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

数据结构或重复的效率超出了这个问题的参数。

还有其他的表是领带回个别Detail线路通过ClaimId, LineNumber,我们经常JOIN DetailHeaderClaimId也是如此。

对于Detail表,这对于聚集索引键更可取:

ClaimId

或者

ClaimId, LineNumber

ClaimId单独不是唯一的,但组合ClaimId, LineNumber对于Detail记录来说是唯一的。

我们中的一位人士认为,ClaimId单是一个更好的聚集键,因为它是更窄,并且查找将是多么有效,因为我们需要知道ClaimId我们在查找之前LineNumber

另一种认为,两者的结合更好,因为它消除了额外的需要RowID,并且可以用于JOIN需要LineNumber作为JOIN条件的支持表。

gbn*_*gbn 9

这是胡说八道:

...单独的 ClaimId 是一个更好的聚集键,因为它更窄

因为这

单独的 ClaimId 不是唯一的j

非唯一聚集索引将添加一个 4 字节的唯一标识符以消除 ClaimId 的歧义,因为它是聚集索引。为什么?一个原因是所有 NC 索引都引用它:那么如何知道 ClaimId 是哪个?

已经证明(前段时间,现在可能无效并且找不到它)当您用尽 4 字节 uniquifier 的 2^32 个值时,非唯一聚集索引会中断

编辑 :

问题说明 ClaimId不是唯一的,因此假设 uniqifier 存在。无需评论它可能不存在于问题的上下文中