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 など) にインデックスを作成する必要がありますか?