Mam coś takiego:
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)
)
Ze względu na wydajność (i impas) stworzyłem nowy indeks na T1
CREATE UNIQUE NONCLUSTERED INDEX IX_T1_Id ON T1 (Id)
Ale jeśli sprawdzę, do którego indeksu odwołuje się FK, nadal odwołuje się do indeksu klastrowego
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');
Jeśli porzucę ograniczenie i utworzę ponownie, odwołuje się on do indeksu nieklastrowanego, ale prowadzi to do ponownego sprawdzenia wszystkich t2 FK.
Czy istnieje sposób, aby to zmienić, więc FK_T2_T1 używa IX_T1_Id zamiast PK_T1 bez upuszczania FK i blokowania tabeli podczas sprawdzania FK?
Dzięki!
sql-server
sql-server-2014
foreign-key
Mariano G.
źródło
źródło
Odpowiedzi:
Po dalszych poszukiwaniach znalazłem ten artykuł
Po czym, chyba że ktoś może powiedzieć inaczej, będę musiał szukać okna czasowego na wykonanie tego zadania.
Dzięki
źródło
Po przeczytaniu MS DOCS tutaj .
W twoim przypadku uważam, że dodaj nowy FK i usuń stary. Aby wyłączyć skanowanie, możesz użyć
NO CHECK
opcjiSprawdź, czy to działa, próbuję dodać jeszcze jeden FK, aby nowy był połączony z utworzonym nowym indeksem i upuścił stary FK. Wiem, że pytanie nie polega na usunięciu istniejącego, ale sprawdzeniu, czy ta opcja ci pomoże.
Ponadto, zgodnie z komentarzami Maxa Vernona: „opcja Z NOCHECK zapobiegnie zaufaniu klucza obcego przez optymalizator. W pewnym momencie będziesz musiał zmienić klucz obcy, aby był zaufany za pomocą ALTER TABLE ... Z KONTROLĄ ”
NOCHECK
Będą ignorowane tylko w momencie tworzenia, ale do egzekwowania integralności contraint masz uruchomić to w pewnym momencie.źródło
WITH NOCHECK
opcja spowoduje, że klucz obcy jest zaufany przez optymalizator. W pewnym momencie będziesz musiał zmienić klucz obcy, aby był zaufany przy użyciuALTER TABLE ... WITH CHECK