我有一个奇怪的问题,在设置nocheck
外部约束并重新启用它之后,
我得到了一个与nocheck
on 一起使用的过时的执行计划。
为什么FKBtoA
即使在使用以下语句再次添加检查后,SQL Server 仍会生成执行计划,就好像禁用了外部约束一样?
alter table B check constraint FKBtoA
[UPDATE1]
到目前为止,删除外部约束并读取它是有效的。
alter table B drop constraint FKBtoA
alter table B add constraint FKBtoA foreign key (AID) references A(ID)
但是对于非常大的桌子,这似乎有点过头了——有没有更好的方法?
[回答]
我必须添加WITH CHECK
如下更改语句才能获得旧的执行计划
alter table B WITH CHECK add constraint FKBtoA foreign key (AID) references A(ID)
这是完整的 SQL 语句
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)
这是每个SELECT
语句的执行计划截图
在禁用外键约束之前
禁用外键约束后
重新启用外键约束后