いいえ、列に外部キーを作成しても、その列にインデックスが自動的に作成されるわけではありません。外部キー列のインデックス作成に失敗すると、次の各状況でテーブル スキャンが発生します。
- 参照先 (親) テーブルからレコードが削除されるたび。
- 2 つのテーブルが外部キーで結合されるたびに。
- FK 列が更新されるたびに。
この例のスキーマでは:
CREATE TABLE MasterOrder (
MasterOrderID INT PRIMARY KEY)
CREATE TABLE OrderDetail(
OrderDetailID INT,
MasterOrderID INT FOREIGN KEY REFERENCES MasterOrder(MasterOrderID)
)
OrderDetail は、MasterOrder テーブルでレコードが削除されるたびにスキャンされます。OrderMaster と OrderDetail を結合するたびに、OrderDetail テーブル全体もスキャンされます。
SELECT ..
FROM
MasterOrder ord
LEFT JOIN OrderDetail det
ON det.MasterOrderID = ord.MasterOrderID
WHERE ord.OrderMasterID = @OrderMasterID
一般に、外部キーにインデックスを付けないことは、規則よりもはるかに例外です。
外部キーのインデックスを作成しないケースは、それがまったく利用されない場合です。これにより、サーバーを維持するためのオーバーヘッドが不要になります。型テーブルは、時々このカテゴリに分類されることがあります。例は次のとおりです。
CREATE TABLE CarType (
CarTypeID INT PRIMARY KEY,
CarTypeName VARCHAR(25)
)
INSERT CarType .. VALUES(1,'SEDAN')
INSERT CarType .. VALUES(2,'COUP')
INSERT CarType .. VALUES(3,'CONVERTABLE')
CREATE TABLE CarInventory (
CarInventoryID INT,
CarTypeID INT FOREIGN KEY REFERENCES CarType(CarTypeID)
)
CarType.CarTypeID フィールドが更新されることはなく、レコードの削除もほとんど行われないという一般的な仮定を立てると、CarInventory が CarTypeID によって検索されなかった場合、CarInventory.CarTypeID のインデックスを維持するサーバーのオーバーヘッドは不要になります。