J'ai quelque chose comme ça:
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)
)
Pour des raisons de performances (et de blocage), j'ai créé un nouvel index sur T1
CREATE UNIQUE NONCLUSTERED INDEX IX_T1_Id ON T1 (Id)
Mais si je vérifie à quel index fait référence le FK, continue de faire référence à l'index clusterisé
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');
Si je laisse tomber la contrainte et que je la crée à nouveau, elle fait référence à l'index non cluster, mais cela conduit à vérifier à nouveau tous les t2 FK.
Existe-t-il un moyen de changer cela pour que le FK_T2_T1 utilise IX_T1_Id au lieu de PK_T1 sans supprimer le FK et verrouiller la table lors de la vérification du FK?
Merci!
sql-server
sql-server-2014
foreign-key
Mariano G
la source
la source
Réponses:
Eh bien, après avoir continué la recherche, j'ai trouvé cet article
Sur quoi, à moins que quelqu'un ne puisse dire le contraire, je devrai chercher une fenêtre de temps pour effectuer cette tâche.
Merci
la source
Après avoir lu MS DOCS ici .
Dans votre cas, je crois ajouter un nouveau FK et supprimer l'ancien. Pour désactiver l'analyse, vous pouvez utiliser l'
NO CHECK
optionVoir si cela fonctionne, ce que j'essaie est d'ajouter un FK de plus pour que le nouveau soit lié au nouvel index créé et de supprimer l'ancien FK. Je sais que la question n'est pas de laisser tomber l'existant mais voyez si cette option vous aidera.
En outre, selon les commentaires de Max Vernon: "l'option WITH NOCHECK empêchera la clé étrangère d'être approuvée par l'optimiseur. À un moment donné, vous devrez modifier la clé étrangère afin qu'elle soit approuvée à l'aide de ALTER TABLE ... AVEC CHÈQUE "
Le
NOCHECK
ne sera ignoré qu'au moment de la création, mais pour appliquer la contraint à l'intégrité, vous l'avez exécuté à un moment donné.la source
WITH NOCHECK
option empêchera la clé étrangère d'être approuvée par l'optimiseur. À un moment donné, vous devrez modifier la clé étrangère afin qu'elle soit approuvée à l'aide deALTER TABLE ... WITH CHECK