1

2 つの外部キー列を持つ単純なマッピング テーブルがあります (CategoryId int, ProductId int)。主キーは両方の列に適用されます。

各製品には複数のカテゴリを含めることができますが、2 つ以上のカテゴリを持つことはめったにありません。一方、カテゴリには一般的に 10,000 以上の製品があります。

主キーの列の順序はパフォーマンスにどのように影響しますか?

テーブルの一般的な使用法は、カテゴリに基づく製品です。

SELECT ProductId FROM [table] WHERE CategoryId = @catid

CategoryIdこれが非クラスター化インデックスである場合、最初に上記のクエリから最高のパフォーマンスを得たいと考えています。同じことがクラスター化インデックスにも当てはまりますか?

4

1 に答える 1

3

はい、同じことがクラスター化インデックスにも当てはまります。クラスタリングによって、行の物理的な順序が決まります。このようにテーブルをシーケンシャルにレイアウトすると、ほとんどのテーブルで I/O が改善されます。ランダム アクセスではなく、高速シーケンシャル I/O で行とページを読み取ることができるからです。

この場合、1 つの製品のカテゴリも取得する必要がある場合は、(CategoryId, ProductId) にクラスター化インデックスを定義し、(ProductId, CategoryId) に非クラスター化インデックスを定義できます。両方のインデックスが同じキーを持っていることに注意してください。マッピング テーブルに 2 つの列しかない場合、両方のインデックスのインデックス ページはまったく同じデータを持ち、順序が異なるだけです。非クラスター化インデックスは、ここでは非常にうまく機能するはずです。SQL Server は行内の他のデータを取得するためにブックマーク ルックアップを実行する必要がないからです。

于 2012-11-28T23:41:31.770 に答える