У меня есть что-то вроде этого:
CREATE TABLE T1 (
Id INT
...
,Constraint [PK_T1] PRIMARY KEY CLUSTERED [Id]
)
CREATE TABLE T2 (
....
,T1_Id INT NOT NULL
,CONSTRAINT [FK_T2_T1] FOREIGN KEY (T1_Id) REFERENCES T1(Id)
)
По причинам производительности (и тупика) я создал новый индекс для T1
CREATE UNIQUE NONCLUSTERED INDEX IX_T1_Id ON T1 (Id)
Но если я проверяю, какой индекс ссылается на FK, продолжает ссылаться на кластерный индекс
select
ix.index_id,
ix.name as index_name,
ix.type_desc as index_type_desc,
fk.name as fk_name
from sys.indexes ix
left join sys.foreign_keys fk on
fk.referenced_object_id = ix.object_id
and fk.key_index_id = ix.index_id
and fk.parent_object_id = object_id('T2')
where ix.object_id = object_id('T1');
Если я отбрасываю ограничение и создаю заново, он ссылается на некластеризованный индекс, но это приводит к повторной проверке всех t2 FK.
Есть ли способ изменить это так, чтобы FK_T2_T1 использовал IX_T1_Id вместо PK_T1, не удаляя FK и не блокируя таблицу на проверку FK?
Спасибо!
sql-server
sql-server-2014
foreign-key
Мариано Г
источник
источник
Ответы:
Ну а после продолжения поиска я нашел эту статью
После чего, если кто-то не скажет иначе, мне придется искать временное окно для выполнения этой задачи.
Спасибо
источник
После прочтения MS DOCS здесь .
В вашем случае я считаю, добавьте новый FK и удалите старый. Для отключения сканирования вы можете использовать
NO CHECK
опциюПосмотрите, работает ли это, я пытаюсь добавить еще один FK, чтобы новый связывался с созданным новым индексом, и отбрасывать старый FK. Я знаю, что вопрос не в том, чтобы отбросить существующий, а посмотреть, поможет ли этот вариант.
Кроме того, согласно комментариям Макса Вернона: «Опция WITH NOCHECK предотвратит доверие внешнего ключа к оптимизатору. В какой-то момент вам придется изменить внешний ключ так, чтобы ему доверяли, используя ALTER TABLE ... С ПРОВЕРКОЙ "
NOCHECK
Будут игнорироваться только в момент создания , но для обеспечения целостности contraint вы запускали это в какой - то момент времени.источник
WITH NOCHECK
опция предотвратит доверие внешнего ключа к оптимизатору. В какой-то момент вам придется изменить внешний ключ так, чтобы ему доверяли с помощьюALTER TABLE ... WITH CHECK