Products と ProductCategories という 2 つのテーブルがあるとします。両方のテーブルには CategoryId の関係があります。これがクエリです。
SELECT p.ProductId, p.Name, c.CategoryId, c.Name AS Category
FROM Products p
INNER JOIN ProductCategories c ON p.CategoryId = c.CategoryId
WHERE c.CategoryId = 1;
実行プランを作成すると、テーブル ProductCategories はクラスター インデックス シークを実行しますが、これは期待どおりです。しかし、テーブル Products の場合はクラスター インデックス スキャンが実行されるため、疑問に思います。なぜ FK はクエリ パフォーマンスの向上に役立たないのでしょうか?
そのため、Products.CategoryId にインデックスを作成する必要があります。実行プランを再度作成すると、両方のテーブルでインデックス シークが実行されます。また、推定サブツリー コストが大幅に削減されます。
私の質問は次のとおりです:
FK は関係制約に役立つほかに、他の有用性がありますか? クエリのパフォーマンスは向上しますか?
すべてのテーブルのすべての FK 列 (Products.CategoryId など) にインデックスを作成する必要がありますか?
ベストアンサー1
外部キーは参照整合性ツールであり、パフォーマンス ツールではありません。少なくとも SQL Server では、FK を作成しても関連するインデックスは作成されないため、検索時間を短縮するにはすべての FK フィールドにインデックスを作成する必要があります。