更改外键的引用索引

Mar*_*o G 9 foreign-key sql-server sql-server-2014

我有这样的事情:

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)
)
Run Code Online (Sandbox Code Playgroud)

出于性能(和死锁)原因,我在 T1 上创建了一个新索引

CREATE UNIQUE NONCLUSTERED INDEX IX_T1_Id ON T1 (Id)
Run Code Online (Sandbox Code Playgroud)

但是如果我检查哪个索引引用了 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');
Run Code Online (Sandbox Code Playgroud)

如果我删除约束并再次创建它引用非聚集索引,但这会导致再次检查所有 t2 FK。

有没有办法改变这一点,以便 FK_T2_T1 使用 IX_T1_Id 而不是 PK_T1 而不删除 FK 并在 FK 检查时锁定表?

谢谢!

Mar*_*o G 6

好吧,继续搜索后我找到了这篇文章

与普通查询不同,它不会因为更新统计信息、创建新索引甚至重启服务器而获取新索引。我知道将 FK 绑定到不同索引的唯一方法是删除并重新创建 FK,让它自动选择索引,而没有手动控制它的选项。

因此,除非有人另有说法,否则我将不得不寻找一个时间窗口来执行此任务。

谢谢