回答:
外部キー制約だけではOracleにインデックスを提供しません。1つを作成する必要があります(作成する必要があります)。
oracle
いますが、Google検索からここに着いたとき、すぐにはわかりません。
外部キーを作成しても、A.B_IDにインデックスが自動的に作成されるわけではありません。したがって、A.B_IDに個別のインデックスを作成することは、クエリパフォーマンスの観点から一般的に意味があります。
Bの行を削除する場合は、必ずA.B_IDにインデックスを付ける必要があります。それ以外の場合、孤立したレコードがないことを確認するために、Bから行を削除するたびに、OracleはAに対して全テーブルスキャンを実行する必要があります(Oracleのバージョンによっては、追加のロックの影響もあるかもしれませんが、それらは減少しますより最近のOracleバージョンでは)。
B_ID
。
詳細については、(a)制約を強制する必要がないため、(b)場合によっては必要ないため、Oracleはインデックスを自動的に作成しません(一意制約の場合とは異なります)。
ただし、ほとんどの場合、インデックスを作成します(実際、Oracle Apexには「インデックス付けされていない外部キー」のレポートがあります)。
アプリケーションが親テーブルの行を削除したり、PK値を更新したりする必要がある場合(これはまれです)は、子テーブル全体をロックする必要があるため、インデックスが存在しない場合、DMLは影響を受けます。
通常、インデックスを追加しないことを選択するケースは、FKが列のドメインを定義する「静的データ」テーブル(たとえば、ステータスコードのテーブル)であり、親テーブルでの更新と削除が行われない場合です。アプリケーションによって直接。ただし、列にインデックスを追加することで、アプリケーションの重要なクエリにメリットがもたらされる場合は、インデックスを使用することをお勧めします。
パフォーマンス上の理由から、インデックスを作成する必要があります。プライマリテーブルの削除操作(削除するレコードが使用されていないことを確認するため)および通常は外部キーが関与する結合で使用されます。インデックスを必要としないテーブルはわずかしかありませんが(ログに作成しません)、おそらくこの場合、おそらく外部キー制約も必要ありません。
だが
外部キーのインデックスを自動的に作成するデータベースがいくつかあります。Jetエンジン(Microsoft Accessファイル)Firebird MySQL
確かに
SQL Server Oracle
ではない
UNIQUE、PRIMARY KEY、およびFOREIGN KEY制約は、制約を適用または「バック」するインデックスを生成します(バックインデックスとも呼ばれます)。PRIMARY KEY制約は一意のインデックスを生成します。FOREIGN KEY制約は、一意でないインデックスを生成します。UNIQUE制約は、すべての列がNULL可能ではない場合に一意のインデックスを生成し、1つ以上の列がNULL可能である場合に非一意のインデックスを生成します。したがって、列または列のセットにUNIQUE、PRIMARY KEY、またはFOREIGN KEY制約がある場合、パフォーマンスのためにこれらの列にインデックスを作成する必要はありません。