Oracleの外部キーにインデックスを作成する必要がありますか?


120

テーブルAとテーブルがありますB。 の主キーに対するA外部キーがあります。BBB_ID

何らかの理由で(正当な理由があることはわかっています)、これら2つのテーブルをキーで結合するときにインデックスを使用していません。

個別にインデックスを作成する必要がありA.B_IDますか、それとも外部キーの存在がそれを提供する必要がありますか?

回答:


136

外部キー制約だけではOracleにインデックスを提供しません。1つを作成する必要があります(作成する必要があります)。


11
一部のデータベースでは、外部キー制約を作成するとインデックスも作成されます...つまり、Jet Engine(MSAccessファイル、FirebirdおよびMySQL)
bubi

17
この回答は、特定のデータベース実装を明示的に参照しないと意味がありません。確かに質問はタグ付けされてoracleいますが、Google検索からここに着いたとき、すぐにはわかりません。
developerbmw

5
PostgreSQL-少なくともこの投稿の時点では-は自動的に実行しないことを確認できます。
デンビンスキー2017年

私が知る限り、SQL Server(2016、Azure ...)についても同じ答えです。
Pac0 2018年

Oracleで外部キーにインデックスを作成する必要があるのはなぜですか?そうしないとどうなりますか?
DJOコングBANG

46

外部キーを作成しても、A.B_IDにインデックスが自動的に作成されるわけではありません。したがって、A.B_IDに個別のインデックスを作成することは、クエリパフォーマンスの観点から一般的に意味があります。

Bの行を削除する場合は、必ずA.B_IDにインデックスを付ける必要があります。それ以外の場合、孤立したレコードがないことを確認するために、Bから行を削除するたびに、OracleはAに対して全テーブルスキャンを実行する必要があります(Oracleのバージョンによっては、追加のロックの影響もあるかもしれませんが、それらは減少しますより最近のOracleバージョンでは)。


1
PFKカラムはどうですか?たとえば、多対多の関係の中間テーブルがある場合、このテーブルの2つのPFK列のインデックスを作成する必要がありますか?
Clamari 2018年

3
@Clamari-Cに(A_ID、B_ID)の主キーがある場合、主キーはAから削除できるようにします。Bからも効率的に削除できるようにする場合は、のインデックスが必要になりますB_ID
ジャスティンケイブ

25

詳細については、(a)制約を強制する必要がないため、(b)場合によっては必要ないため、Oracleはインデックスを自動的に作成しません(一意制約の場合とは異なります)。

ただし、ほとんどの場合、インデックスを作成します(実際、Oracle Apexには「インデックス付けされていない外部キー」のレポートがあります)。

アプリケーションが親テーブルの行を削除したり、PK値を更新したりする必要がある場合(これはまれです)は、子テーブル全体をロックする必要があるため、インデックスが存在しない場合、DMLは影響を受けます。

通常、インデックスを追加しないことを選択するケースは、FKが列のドメインを定義する「静的データ」テーブル(たとえば、ステータスコードのテーブル)であり、親テーブルでの更新と削除が行われない場合です。アプリケーションによって直接。ただし、列にインデックスを追加することで、アプリケーションの重要なクエリにメリットがもたらされる場合は、インデックスを使用することをお勧めします。


14

SQL Serverが外部キー列にインデックスを自動的に配置したことはありません。この都市の神話の背景と歴史に関するKim Trippの優れたブログ投稿をチェックしてください。

ただし、通常は外部キー列にインデックスを付けることをお勧めします。そのため、各FK列がインデックスでバックアップされていることを確認することをお勧めします。必ずしもその1つの列だけである必要はありません。FK列を最初の列として、2つまたは3つの列にインデックスを作成することは意味があるかもしれません。シナリオとデータによって異なります。


8

パフォーマンス上の理由から、インデックスを作成する必要があります。プライマリテーブルの削除操作(削除するレコードが使用されていないことを確認するため)および通常は外部キーが関与する結合で使用されます。インデックスを必要としないテーブルはわずかしかありませんが(ログに作成しません)、おそらくこの場合、おそらく外部キー制約も必要ありません。

だが

外部キーのインデックスを自動的に作成するデータベースがいくつかあります。Jetエンジン(Microsoft Accessファイル)Firebird MySQL

確かに

SQL Server Oracle

ではない


3
FIrebird SQLが自動的に行うことを言及してくださったThx。それがまさに私が求めていたポイントです。
user424855 2015

1

パフォーマンスに関するものと同様に、それは多くの要因に依存し、非常に高い活動環境ではインデックスの維持が受け入れられない可能性があるなど、簡単な箇条書きはありません。

ここで最も目立つのは選択性のようです。インデックスの値が非常に重複している場合、インデックスを削除し(可能な場合)、テーブルスキャンを許可するとパフォーマンスが向上する可能性があります。


1

UNIQUE、PRIMARY KEY、およびFOREIGN KEY制約は、制約を適用または「バック」するインデックスを生成します(バックインデックスとも呼ばれます)。PRIMARY KEY制約は一意のインデックスを生成します。FOREIGN KEY制約は、一意でないインデックスを生成します。UNIQUE制約は、すべての列がNULL可能ではない場合に一意のインデックスを生成し、1つ以上の列がNULL可能である場合に非一意のインデックスを生成します。したがって、列または列のセットにUNIQUE、PRIMARY KEY、またはFOREIGN KEY制約がある場合、パフォーマンスのためにこれらの列にインデックスを作成する必要はありません。



リンクしたドキュメントは、組み込みJavaデータベースであるDerby用であり、Oracle用ではありません。
ダボス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.