問題を解決する最も簡単な方法は、PostgreSQLから詳細なタイミングを照会することですEXPLAIN
。そのためには、少なくとも1つのクエリを見つける必要があります。このクエリは完了しますが、予想よりも時間がかかります。この行が次のようになるとしましょう
delete from mydata where id='897b4dde-6a0d-4159-91e6-88e84519e6b6';
そのコマンドを実際に実行する代わりに、次のことができます
begin;
explain (analyze,buffers,timing) delete from mydata where id='897b4dde-6a0d-4159-91e6-88e84519e6b6';
rollback;
最終的にロールバックすると、データベースを実際に変更せずにこれを実行できますが、それでもどれだけの時間がかかったのかについての詳細なタイミングが得られます。それを実行した後、出力でいくつかのトリガーが大きな遅延を引き起こすことがわかります:
...
Trigger for constraint XYZ123: time=12311.292 calls=1
...
time
このcontraintは12.3秒程度かかっチェックするように、ミリ秒(ミリ秒)です。INDEX
このトリガーを効果的に計算できるように、必要な列に新しい列を追加する必要があります。外部キー参照の場合、別のテーブルを参照する列(つまり、ターゲット列ではなくソース列)にインデックスを付ける必要があります。PostgreSQLはそのようなインデックスを自動的に作成せずDELETE
、本当にそのインデックスが本当に必要な唯一の一般的なクエリです。その結果、DELETE
インデックスが欠落しているために遅すぎるケースに突き当たるまで、長年のデータを蓄積している可能性があります。
その制約(または非常に長い時間がかかった他のこと)のパフォーマンスを修正したら、begin
/ rollback
ブロック内のコマンドを繰り返して、新しい実行時間を以前と比較できるようにします。1行の削除応答時間に満足するまで続行します(異なるインデックスを追加するだけで、25.6秒から15ミリ秒に1つのクエリを取得しました)。その後、ハッキングなしで完全な削除を完了することができます。
(注意してくださいEXPLAIN
。正常に完了するクエリが必要です。一度、PostgreSQLが1つの削除が外部キー制約に違反することを理解するのに非常に時間がかかり、その場合EXPLAIN
は失敗のタイミングを出力しないため使用できません)という問題がありましたクエリ。このような場合にパフォーマンスの問題をデバッグする簡単な方法はわかりません。)