18

postgresqlDBとほぼ10億行のテーブルがあります。デフォルト値で新しい列を追加しようとすると:

ALTER TABLE big_table
ADD COLUMN some_flag integer NOT NULL DEFAULT 0;

トランザクションは30分以上続き、DBログは警告を発し始めます。

クエリを最適化する方法はありますか?

4

3 に答える 3

9

バッチで行う以外に(まだ時間がかかります):

テーブルをCOPYステートメントとしてダンプし、COPY ステートメントの内容を編集して別の列を挿入するスクリプトを作成できます (COPY は CSV IIRC にすることができます)。

COPY次に、変更されたダンプをリロードするだけで、 ALTERCOPY はトランザクションをログに記録しないため、理論的には よりも高速になるはずです。

もう1つのオプションは、コマンドの実行中にオフfsyncにすることです...忘れずにオンに戻してください。

上記の両方をバッチで実行することもできます。

于 2012-12-08T15:50:12.003 に答える
5

デフォルトなしで列を作成し、断続的なコミットで行をバッチで手動で更新してデフォルトを適用することを検討します。

于 2012-12-08T11:51:00.927 に答える