我们有一个大表[MyTable]
目前既有Primary Key
,和一个Unique Non Clustered Index
在同一列([KeyColumn]
)。U NC索引还具有其他覆盖列。
在同一列上同时拥有PK和唯一NC索引似乎是多余的,因此我考虑删除主键,而是出于引用完整性的目的而使用唯一非聚集索引。
请注意,该表完全由另一列群集。
即所以我们有:
ALTER TABLE [MyTable]
ADD CONSTRAINT [PK_MyTable]
PRIMARY KEY NONCLUSTERED ([KeyColumn])
GO
和
CREATE UNIQUE NONCLUSTERED INDEX [IX_MyTable_SomeIndex]
ON [MyTable] ([KeyColumn])
INCLUDE ([Column1], [Column2])
GO
据我所知,不可能将覆盖列添加到主键,所以我打算这样做:
- 放弃依赖于的外键约束
MyTable.KeyColumn
- 将主键
MyTable.KeyColumn
完全放在 - 将外键重新添加到表中(即RI将通过强制执行
MyTable.KeyColumn
)
我能想到的唯一含义是,我们不会在ERD图上看到可视键符号,并且由于包含了列,因此(叶)索引密度会降低。
我已阅读/programming/487314/primary-key-or-unique-index,并对这样做的完整性和性能方面感到满意。
我的问题是:这种方法有缺陷吗?
编辑 我要完成的任务:性能优化和春季大扫除。通过删除PK或索引,我的索引所需的页面将更少=更快的写入速度,再加上维护/操作的好处,即减少索引以保持碎片整理等。
为了提供一些背景知识,我从来没有过没有PK的表被引用过。但是,在表中添加了带有覆盖列的NC索引这一事实意味着我需要调整自己的想法。