Ich habe so etwas:
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)
)
Aus Gründen der Leistung (und des Deadlocks) habe ich einen neuen Index für T1 erstellt
CREATE UNIQUE NONCLUSTERED INDEX IX_T1_Id ON T1 (Id)
Wenn ich jedoch überprüfe, auf welchen Index der FK verweist, wird weiterhin auf den Clustered-Index verwiesen
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');
Wenn ich die Einschränkung lösche und erneut erstelle, verweist sie auf den nicht gruppierten Index. Dies führt jedoch dazu, dass alle t2 FK erneut überprüft werden.
Gibt es eine Möglichkeit, dies zu ändern, sodass der FK_T2_T1 IX_T1_Id anstelle von PK_T1 verwendet, ohne den FK zu löschen und die Tabelle bei der FK-Prüfung zu sperren?
Vielen Dank!
sql-server
sql-server-2014
foreign-key
Mariano G.
quelle
quelle
Antworten:
Nachdem ich weiter gesucht hatte, fand ich diesen Artikel
Daraufhin muss ich, sofern nicht jemand etwas anderes sagen kann, nach einem Zeitfenster suchen, um diese Aufgabe auszuführen.
Vielen Dank
quelle
Nach dem Lesen von MS DOCS hier .
In Ihrem Fall, glaube ich, fügen Sie einen neuen FK hinzu und löschen Sie den alten. Um den Scan zu deaktivieren, können Sie die
NO CHECK
Option verwendenWenn dies funktioniert, versuche ich, einen weiteren FK hinzuzufügen, damit der neue mit dem neu erstellten Index verknüpft wird, und den alten FK zu löschen. Ich weiß, dass die Frage nicht darin besteht, die vorhandene zu löschen, sondern zu prüfen, ob diese Option Ihnen hilft.
Gemäß den Kommentaren von Max Vernon: "Die Option WITH NOCHECK verhindert, dass der Optimierer dem Fremdschlüssel vertraut. Irgendwann müssten Sie den Fremdschlüssel so ändern, dass er mit ALTER TABLE vertrauenswürdig ist ... MIT PRÜFUNG "
Das
NOCHECK
wird nur zum Zeitpunkt der Erstellung ignoriert, aber um die Integrität zu verhindern, haben Sie dies zu einem bestimmten Zeitpunkt ausgeführt.quelle
WITH NOCHECK
Option verhindert, dass der Optimierer dem Fremdschlüssel vertraut. Irgendwann müssten Sie den Fremdschlüssel so ändern, dass er vertrauenswürdig istALTER TABLE ... WITH CHECK