2011-07-08 11 views
1

ちょっと複雑なデータをインポートする必要があります。 1つのクエリで3百万以上の行を更新しているUPDATEをいくつか実行する必要があります。このクエリでは、それぞれ約30〜45秒(一部は4-5分)も適用されます。私の質問は、私がそれをスピードアップできるかどうかです。どこで何かを読むことができますか、どのようなインデックスとその列を使って更新を改善することができますか。私はexacly答えが必要ないので、私はテーブルを表示しないでください。私はそれについて学ぶためにいくつかのものを探しています。 のUPDATEの数では、各更新された行に1つのUPDATEコマンドを意味する場合Postgres Optimization UPDATE

+0

UPDATEステートメントの実行計画をここに書いてください(フォーマット済みのコードまたはhttp://explain.depesz.com/へのリンクのいずれかとしてください)。この種の質問を投稿するときに役立つ情報を見つけるために、この記事(http://wiki.postgresql.org/wiki/SlowQueryQuestions)を読むこともできます。 –

答えて

5

2つのことを参照してください。

2)UPDATEがアトミックである必要がない場合は、UPDATEの影響を受ける行の数を分割することを検討してください。

  1. BEGIN
  2. UPDATE ... LIMIT N;又は(例えばWHERE username ilike 'a%';)行の数を制限するいくつかの述語:起因Free Space Mapを超えると、「失われた行」の数を最小限にするために、以下のアプローチを考えます。
  3. COMMIT
  4. VACUUM table_being_updated
  5. すべての行が更新されるまで、ステップ1〜4を繰り返し。
  6. ANALYZE table_being_updated

私はあなたのテーブルのすべての行を更新していると破壊の上記のアプローチので、単一のトランザクションの終了時に新しい値で表示されるようにすべての行を必要としない疑いがありますUPDATEより小さいトランザクションには良いアプローチになります。

そして、UPDATEの述語で指定された関連する列のINDEXが劇的に役立つでしょう。さらに援助が必要な場合はEXPLAIN ANALYZEを転記してください。

0

はその後の問題は、すべてのターゲット表のインデックスが更新され、すべての制約がそれぞれ更新された行でチェックされるということです。その場合は、その後、単一のUPDATEですべての行を更新する代わりにしてみてください:インポートされたデータはテキストファイルである場合

update t 
set a = t2.b 
from t2 
where t.id = t2.id 

その後、最初の一時テーブルに挿入し、そこからアップデート。

1)あなたのUPDATEクエリのEXPLAIN ANALYZEを投稿:私の答えhere