J'ai un problème bizarre où, après la mise en nocheck
sur une contrainte étrangère et réactivant lui,plan d'exécution bizarrerie après réactivant contrainte de clé étrangère
Je reçois un même plan d'exécution hors daté qui a été utilisé avec nocheck
sur. Pourquoi le serveur SQL génère-t-il un plan d'exécution comme si la contrainte étrangère FKBtoA
était désactivée même après l'ajout de la vérification avec l'instruction suivante?
Pourquoi le serveur SQL générerait-il un plan d'exécution?
alter table B check constraint FKBtoA
[Update1]
Jusqu'à présent, laissant tomber la contrainte étrangère et readding cela a fonctionné. Mais pour les tables vraiment grandes, cela semble être une exagération - Y at-il un meilleur moyen?
[REPONSE]
J'ai dû ajouter WITH CHECK
dans l'instruction alter comme suit pour obtenir l'ancien plan d'exécution
alter table B WITH CHECK add constraint FKBtoA foreign key (AID) references A(ID)
Voici une déclaration SQL complète
create table A (ID int identity primary key)
create table B (
ID int identity primary key,
AID int not null constraint FKBtoA references A (ID)
)
select *
from B
where exists (select 1 from A where A.ID = B.AID)
alter table B nocheck constraint FKBtoA
GO
select *
from B
where exists (select 1 from A where A.ID = B.AID)
alter table B check constraint FKBtoA
GO
select *
from B
where exists (select 1 from A where A.ID = B.AID)
Voici la capture d'écran des plans d'exécution par chaque instruction SELECT
Avant de désactiver la contrainte de clé étrangère
Après avoir désactivé la contrainte de clé étrangère
Après réactivant contrainte de clé étrangère
Ah, ha! c'était la clause "with check" que j'avais besoin d'ajouter dans "alter table B add constraint" donc ça devait être "alter table B WITH CHECK add constraint ..."! Et "sys.check_constraints.is_not_trusted" a été mis à 1 quand j'ai modifié contrainte avec NOCHECK ... – Sung
+1 pour "Cette réponse est utile". Je ne connaissais pas de telles choses comme des contraintes non fiables. –
Voici un bon article sur le sujet - http://explainextended.com/2009/10/15/constraints-and-the-optimizer-in-sql-server-foreign-key/ – EBarr