У нас есть большая таблица, в [MyTable]
которой в настоящее время есть и a Primary Key
, и a Unique Non Clustered Index
в одном столбце ( [KeyColumn]
). Индекс U NC также имеет дополнительные столбцы покрытия.
Наличие как PK, так и Unique NC Index в одних и тех же столбцах представляется избыточным, поэтому я рассмотрел вопрос об удалении первичного ключа и использовании вместо этого уникального некластеризованного индекса для целей ссылочной целостности.
Обратите внимание, что таблица полностью кластеризована другим столбцом.
То есть так имеем:
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 или индекса будет меньше страниц, необходимых для моих индексов = более быстрая запись, плюс также преимущества обслуживания / эксплуатации, то есть на один индекс меньше, чтобы сохранить дефрагментацию и т. Д.
Чтобы подвести итог этому, у меня никогда раньше не было таблицы, на которую ссылаются, без ПК. Однако тот факт, что в таблицу добавлен индекс NC с покрывающими столбцами, означает, что мне нужно адаптировать свое мышление.