我们有一个大表[MyTable]
目前既有Primary Key
,和一个Unique Non Clustered Index
在同一列([KeyColumn]
)。UNC 索引还有额外的覆盖栏。
在同一列上同时拥有 PK 和唯一 NC 索引似乎是多余的,所以我考虑删除主键,而是使用唯一非聚集索引来实现引用完整性。
请注意,该表完全由另一列聚集在一起。
即所以我们有:
ALTER TABLE [MyTable]
ADD CONSTRAINT [PK_MyTable]
PRIMARY KEY NONCLUSTERED ([KeyColumn])
GO
Run Code Online (Sandbox Code Playgroud)
和
CREATE UNIQUE NONCLUSTERED INDEX [IX_MyTable_SomeIndex]
ON [MyTable] ([KeyColumn])
INCLUDE ([Column1], [Column2])
GO
Run Code Online (Sandbox Code Playgroud)
据我所知,不可能向主键添加覆盖列,所以我打算这样做:
MyTable.KeyColumn
MyTable.KeyColumn
完全删除主键MyTable.KeyColumn
)我能想到这样做的唯一含义是我们不会在 ERD 图表上得到可视化的关键符号,并且(叶)索引密度会因为包含的列而减少。
我已阅读/sf/ask/34112011/并且对这样做的完整性和性能方面感到满意。
我的问题是:这种方法有缺陷吗?
编辑 我想要完成的工作:性能优化和春季大扫除。通过删除 PK 或索引,我的索引将需要更少的页面 = 更快的写入,加上维护/操作的好处,即少一个索引来保持碎片整理等。
为了提供一些背景知识,我以前从未有过没有 PK 的表被引用。但是,将带有覆盖列的 NC 索引添加到表中这一事实意味着我需要调整我的想法。