2017-07-04 4 views
0

私はテーブルの上に簡単な更新クエリを実行します。大きなテーブルの単純なクエリはなぜずっと遅いのですか?

UPDATE table_x SET col_a = (col_b AT TIME ZONE 'UTC') AT TIME ZONE col_tz; 

table_xは100のエントリで構成され、クエリが数ミリ秒かかります。
- > 100,000エントリ= 2秒。
- > 1,000,000エントリ= 20秒。
これまでのところとても良いです。しかし、テーブルが20Mエントリで構成されている場合、クエリは永遠に実行されます。誰かがこれの理由を知っていますか?そしてこれを克服するために何ができるでしょうか?

多分、私は自分のコンピュータに約13 GBの空きディスク容量しかないと付け加えるべきです。

+0

それはトランザクション内で起こることがあります。すべての更新が完了または辞退しなければなりません。したがって、トランザクションや小さなサブセットで文を実行することができます。 – Justas

+0

私はあなたが1つのトランザクション内で非常に多くのレコードを更新すべきではないと思っています。私はFirebirdを使用しており、同じように動作します。私がデータベースに書き込む必要があるとき(UPDATE、INSERT、DELETE)、私は50000以上のレコードを変更しないよう注意しますが、変更されるデータに依存します。基本的に、1つのトランザクション内で1Mレコードを決して変更しないでください。 –

+1

20M操作で交換していますが、1M操作で交換していないかどうか確認できますか? –

答えて

1

通常の動作で、更新パフォーマンスが低下します。問題は、更新のたびにインデックスを更新する必要があることです。データをデータベースにインポートする場合は、データベースのバッチ機能を使用する必要があります。これにより、インデックスが一時的に無効になり、後で再構築されます。例えばSqliteをのための同じ

Sqlite appending data performance linear degradation, is this solvable?

+0

PostgreSQLにこのような「バッチ機能」はありません。インデックスを自分で作成し直す必要があります。 –

関連する問題