delete from a A where a.ID = 132.
テーブル A には約 5000 のレコードが含まれており、A.ID はテーブル A の主キーです。しかし、削除に時間がかかっています。タイムアウトになることもあります。そのテーブルには 3 つのインデックスが含まれており、3 つの外部キーによって参照されます。主キーに基づいて削除しているのに、なぜ時間がかかるのか説明してもらえますか。そして、この問題を最適化する方法を教えてください...?
delete from a A where a.ID = 132.
テーブル A には約 5000 のレコードが含まれており、A.ID はテーブル A の主キーです。しかし、削除に時間がかかっています。タイムアウトになることもあります。そのテーブルには 3 つのインデックスが含まれており、3 つの外部キーによって参照されます。主キーに基づいて削除しているのに、なぜ時間がかかるのか説明してもらえますか。そして、この問題を最適化する方法を教えてください...?
考えられる原因:
1) カスケード削除操作
2) トリガー
3)主キー列の型が整数以外であるため、比較を行うために各 pk 値の型変換が強制されます。これには、完全なテーブル スキャンが必要です。
4)質問に投稿したように、クエリは本当にドットで終わりますか?その場合、その数値は整数ではなく浮動小数点数であると見なされる可能性があり、3) と同様の型変換が発生します。
5)削除クエリは、他の遅いクエリがロックを解放するのを待っています
明らかに、長い時間がかかるべきではありません。ただし、その理由を正確に把握するには、ここには十分な情報がありません。ただし、外部キーに注目する必要があると言えます。
これらは、他のはるかに大きなテーブルからの制約を課すと、処理が遅くなる可能性があります。また、タイムアウトが削除を妨げる整合性チェックが原因であることがわかる場合もあります (問題は、タイムアウトではなく例外が発生しない理由です)。
私の次のステップは、外部キーを削除してパフォーマンスをチェックすることです。次に、一度に 1 つずつ元に戻して、パフォーマンスを確認します。
他の操作 (挿入、選択、更新など) に時間がかかっていませんか?
最初の考え: 外部キーのインデックス?
再考: 発火のトリガー?
統計を更新してみてください。5000行は大したことではありません。これを定期的に行っている場合は、そのテーブルのメンテナンスもスケジュールする必要があります (つまり、インデックスの再構築、統計の更新など)。
他の人が観察したように、考えられる容疑者は外部キーです。
第一に、従属テーブルが他のテーブルによって参照される場合、ON DELETE CASCADE が勢いを増す可能性があるためです。
第 2 に、削除する必要がある行を他のユーザーがロックしている可能性があるためです。これがタイムアウトの最も可能性の高い原因です。これがどのように機能するかは、データベースのフレーバーとバージョンによって異なります。たとえば、古いバージョンの Oracle (<=8.0) では、外部キー列がインデックス化されていない限り、従属テーブル全体をロックする必要がありました。