1. ホーム
  2. sql

[解決済み] 外部キーはクエリーのパフォーマンスを向上させるか?

2022-04-26 17:51:05

質問

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テーブルはクラスタインデックスシークを実行し、これは予想通りです。しかし、テーブルProductでは、クラスタインデックススキャンが実行されます。なぜFKはクエリパフォーマンスを向上させないのでしょうか?

そこで、私はProducts.CategoryIdにインデックスを作成しなければなりません。実行計画を再度作成すると、両方のテーブルでインデックスシークが実行されます。そして、サブツリーの推定コストは大幅に削減されます。

質問です。

  1. FKは関係制約に役立つ以外に、何か有用なことがあるのでしょうか?クエリパフォーマンスを向上させることができますか?

  2. すべてのテーブルのすべてのFKカラム(Products.CategoryIdが好き)にインデックスを作成する必要がありますか?

解決方法は?

外部キーは参照整合性のためのツールであり、パフォーマンスのためのツールではありません。少なくともSQL Serverでは、FKを作成しても関連するインデックスは作成されず、検索時間を短縮するためには、すべてのFKフィールドにインデックスを作成する必要があります。