「テーブルの作成」の文法では、クラスター化された外部キー制約を指定することはできません。言い換えれば、これは違法です:
--keyword CLUSTERED must be removed before this will execute...
CREATE TABLE [Content](
[ID] [int] NOT NULL CONSTRAINT PK_Content_ID PRIMARY KEY,
ContentDefID int NOT NULL CONSTRAINT FK_Plugin_ContentDef FOREIGN KEY CLUSTERED REFERENCES ContentDef(ID)
)
GO
しかし、なぜそれが違法なのか理解できません。外部キーをクラスタリングすると、ページルックアップのパフォーマンスが向上するというISTM。つまり、「親ID20の子アイテム80から140をください」。
これには理由がありますか?
アップデート
OdedとTvanfossonのフィードバックに基づいて、次のことが機能することがわかりました。
CREATE TABLE [Content](
[ID] [int] NOT NULL CONSTRAINT PK_Content_ID PRIMARY KEY,
ContentDefID int NOT NULL UNIQUE CLUSTERED CONSTRAINT FK_ContentDefContent FOREIGN KEY REFERENCES ContentDef(ID)
)
GO
しかし、上記はそれが解決するよりも多くの問題を引き起こします。まず、「UNIQUE」外部キーは、私の関係を私が望まない1対1にすることを強制します。次に、これは、単一のCLUSTERED FOREIGN KEYではなく、2つの別個の制約の作成を表すためにのみ機能します。
しかし、この調査は私を私の答えに近づけています。明らかに、ここでSOに記載されているように、クラスター化インデックスは一意である必要があります。引用:
クラスタ化インデックスが一意のインデックスでない場合、SQL Serverは、一意化子と呼ばれる内部で生成された値を追加することにより、重複するキーを一意にします
特に、この答えはそれをカバーしていると思います。