小编Stu*_*tLC的帖子

使用带有覆盖列的唯一非聚集索引而不是主键的含义

我们有一个大表[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完全删除主键
  • 将外键重新添加到表中(即 RI 将通过 强制执行MyTable.KeyColumn

我能想到这样做的唯一含义是我们不会在 ERD 图表上得到可视化的关键符号,并且(叶)索引密度会因为包含的列而减少。

我已阅读/sf/ask/34112011/并且对这样做的完整性和性能方面感到满意。

我的问题是:这种方法有缺陷吗?

编辑 我想要完成的工作:性能优化和春季大扫除。通过删除 PK 或索引,我的索引将需要更少的页面 = 更快的写入,加上维护/操作的好处,即少一个索引来保持碎片整理等。

为了提供一些背景知识,我以前从未有过没有 PK 的表被引用。但是,将带有覆盖列的 NC 索引添加到表中这一事实意味着我需要调整我的想法。

sql-server-2008 sql-server

12
推荐指数
1
解决办法
5659
查看次数

标签 统计

sql-server ×1

sql-server-2008 ×1