4

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
4

1 に答える 1

2

マーティン、これが大した答えではないことをお詫びしますが、あなたも私を興味深くさせたので、いくつか掘り下げました. 私が共有できる情報は次のとおりです。

デナリを含む現在のバージョンでは、この状況で代替案が検討される可能性はほとんどありません。

于 2011-09-08T19:27:29.950 に答える