Будет ли проверка FK в SQL Server всегда использовать индекс, указанный в sys.foreign_keys? - PullRequest
4 голосов
/ 06 сентября 2011

Я не могу найти ничего, обсуждающего случай, когда существует несколько возможных индексов, которые можно использовать для резервного копирования ограничения FK.

Из теста ниже видно, что во время создания FK FK связывается сопределенный индекс, и он всегда будет использоваться для проверки ограничения FK, независимо от того, будет ли добавлен новый лучший индекс позже.

Может ли какой-либо один указать на какие-либо ресурсы, подтверждающие или опровергающие это?

CREATE TABLE T1(
    T1_Id INT IDENTITY(1,1) PRIMARY KEY CLUSTERED  NOT NULL,
    Filler CHAR(4000) NULL,
) 

INSERT INTO T1 VALUES ('');


CREATE TABLE T2(
    T2_Id INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
    T1_Id INT NOT NULL CONSTRAINT FK REFERENCES T1 (T1_Id), 
    Filler CHAR(4000) NULL,
)

/*Execution Plan uses clustered index - There is no NCI*/ 
INSERT INTO T2 VALUES (1,1) 

ALTER TABLE T1 ADD CONSTRAINT
    UQ_T1 UNIQUE NONCLUSTERED(T1_Id) 

/*Execution Plan still use clustered index even after NCI created*/    
INSERT INTO T2 VALUES (1,1) 

SELECT fk.name,
       ix.name,
       ix.type_desc
FROM sys.foreign_keys fk
JOIN sys.indexes ix ON ix.object_id = fk.referenced_object_id
AND ix.index_id = fk.key_index_id
WHERE fk.name = 'FK'


ALTER TABLE T2 DROP CONSTRAINT FK
ALTER TABLE T2  WITH CHECK ADD  CONSTRAINT FK FOREIGN KEY(T1_Id)
REFERENCES T1 (T1_Id)    

/*Now Execution Plan now uses non clustered index*/    
INSERT INTO T2 VALUES (1,1)    

SELECT fk.name,
       ix.name,
       ix.type_desc
FROM sys.foreign_keys fk
JOIN sys.indexes ix ON ix.object_id = fk.referenced_object_id
AND ix.index_id = fk.key_index_id
WHERE fk.name = 'FK'

DROP TABLE T2
DROP TABLE T1

1 Ответ

2 голосов
/ 08 сентября 2011

Мартин, я прошу прощения, что это не очень хороший ответ, но так как вы также заинтересовали меня, я немного покопался.Информация, которой я могу поделиться:

В текущих версиях, включая Denali, маловероятно, что в этой ситуации когда-либо будет рассматриваться альтернатива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...