我的 DBA 和我在索引结构上存在分歧。
考虑医疗索赔的数据......
我们有包含以下Header
字段的表:
ClaimId (varchar(50)), PaidAmount, MemberID...
对于每个标题,我们都有一个或多个记录,Detail
例如:
ClaimId (varchar(50)), LineNumber (smallint), MemberId...
结构的效率或数据的重复不在这个问题的参数范围内。
还有其他表格可以通过 联系到各个Detail
行ClaimId, LineNumber
,我们也经常JOIN
Detail
这样Header
做ClaimId
。
对于Detail
表,聚簇索引键更可取:
ClaimId
或者
ClaimId, LineNumber
ClaimId
单独不是唯一的,但组合ClaimId, LineNumber
对于记录来说是唯一的Detail
。
我们中的一个人认为ClaimId
alone 是一个更好的聚簇键,因为它更窄,并且查找将同样有效,因为我们需要ClaimId
在查找LineNumber
.
另一个认为两者的结合更好,因为它不需要额外的RowID
, 并且可以用于JOIN
ing 到需要LineNumber
作为JOIN
条件的支持表。
这是胡说八道:
因为这
非唯一聚集索引将添加一个 4 字节唯一标识符以消除 ClaimId 的歧义,因为它是聚集索引。为什么?一个原因是所有 NC 索引都引用它:那么如何知道 ClaimId 是哪个呢?
已经证明(前段时间,现在可能无效并且无法找到它)当您用尽 4 字节唯一标识符的 2^32 个值时,非唯一聚集索引会中断
编辑 :
问题声明 ClaimId不是唯一的,因此假设 uniqifier 存在。无需评论它可能不存在于问题的上下文中