2

ここでこれを見つけました:

一般に、次のいずれかの状況では、列にインデックスを作成することを検討してください。

  • 1 つまたは複数のインデックス付きの列に参照整合性制約が存在します。インデックスは、親テーブルの主キーを更新したり、親テーブルにマージしたり、親テーブルから削除したりする場合に必要となる完全なテーブル ロックを回避する手段です。

このような状況でテーブル全体のロックが発生する理由がわかりません。親テーブルの主キーを削除/更新しようとすると、子テーブルで完全なテーブルスキャンが実行されると思いました。

ロックはどこから来るのですか?

4

1 に答える 1

5

こちらのTom Kyteブログ エントリをご覧ください。その中で、彼は次の説明が提供されているOracle のドキュメントを参照しています。

  • 子テーブルの完全なテーブル ロックを防ぎます。代わりに、データベースはインデックスの行ロックを取得します。
  • 子テーブルのフル テーブル スキャンが不要になります。例として、ユーザーが部門テーブルから部門 10 のレコードを削除するとします。employees.department_id が索引付けされていない場合、データベースは従業員をスキャンして、部門10に従業員が存在するかどうかを確認する必要があります。

最初のシナリオでは、列が索引付けされていない場合、Oracle は子テーブルでどの行を更新する必要があるかを認識していないため、テーブル全体をロックする必要があります。インデックスを使用すると、Oracle は問題の行を識別し、それらをロックすることができます。完全なテーブル ロックがなければ、親を変更し、別のセッションで子を制約に違反するものに変更することができます。

于 2013-09-25T13:06:19.920 に答える