私たちは、大きなテーブル持っている[MyTable]
現在の両方Aを有し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インデックスがテーブルに追加されたという事実は、自分の考え方を適応させる必要があることを意味します。