2017-02-01 6 views
0

SQLステートメントを速くする方法があるかどうかわかりません。このアップデートステートメントのスピードアップはどうすればできますか

UPDATE table_one SET column_x = table_two.column_x FROM table_two 
WHERE table_one.column_y = table_two.column_y; 

現在、上記のクエリは3時間以上実行されています。それをより速くする方法に関する提案はありますか?

詳細:

  • table_one 190万のレコード
  • を持っているtable_twoは、両方のテーブル390万のレコード
  • column_xとcolumn_yを持っては整数です。両方のテーブルに
  • column_yは

は、RAMの120ギガバイトとPostgreSQL 9.3と22個のコアとVM上で実行していインデックスされます。

+0

質問ですが、WHERE句の順序は重要ですか?つまり、もし 'table_one.column_y = table_two.column_y'の代わりに' table_two.column_y = table_one.column_y'と言ったら? – lukik

+0

私の提案があなたを助けてくれず、まだ解決策を探しているなら、あなたのコマンドを実行するexplain analyzeの結果を加えてください。 –

答えて

3

あなたは、少なくとも、すべてのレコードを更新する必要はありません。

UPDATE table_one 
     SET column_x = table_two.column_x 
    FROM table_two 
     WHERE table_one.column_y = table_two.column_y 
     AND table_one.column_x != table_two.column_x; 

またおそらく役立つかもしれない、両方のテーブルのフィールドxとyの両方のインデックスを作成することです。

+0

私の理解では、非索引列は挿入された/更新されたものよりも速く索引付けされたものよりも処理されることになるので、table_one.column_xを残す理由は索引付けされていません... – lukik

+0

しかし、 'scan 'only' scan –

+0

この場合、すべてのレコードを更新しています。なぜなら、' table_one' * - 更新するテーブル - *は 'table_two'に含まれていることを確認しています。 *。だから、あなたは「あなたはすべてのレコードを更新する必要はない」というあなたの提案はまだ立っていますか? – lukik

関連する問題