我有这样的事情:
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)
)
出于性能(和死锁)的原因,我在 T1 上创建了一个新索引
CREATE UNIQUE NONCLUSTERED INDEX IX_T1_Id ON T1 (Id)
但是,如果我检查哪个索引引用了 FK,则继续引用聚集索引
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');
如果我删除约束并再次创建它会引用非聚集索引,但这会导致再次检查所有 t2 FK。
有没有办法改变这一点,所以 FK_T2_T1 使用 IX_T1_Id 而不是 PK_T1 而不删除 FK 并在 FK 检查时锁定表?
谢谢!
好吧,继续搜索后,我找到了这篇文章
因此,除非有人另有说法,否则我将不得不寻找一个时间窗口来执行此任务。
谢谢
在这里阅读 MS DOCS 后。
在你的情况下,我相信添加一个新的 FK 并删除旧的。要禁用扫描,您可以使用
NO CHECK
选项看看这是否可行,我正在尝试再添加一个 FK,以便将新的 FK 链接到创建的新索引并删除旧的 FK。我知道问题不是放弃现有的,而是看看这个选项是否会对你有所帮助。
此外,根据 Max Vernon 的评论:“ WITH NOCHECK 选项将阻止优化器信任外键。在某些时候,您必须更改外键以便使用 ALTER TABLE 来信任它......带支票”
NOCHECK
只会在创建时被忽略,但为了强制执行完整性约束,您已经在某个时间点运行它。