postgresqlDBとほぼ10億行のテーブルがあります。デフォルト値で新しい列を追加しようとすると:
ALTER TABLE big_table
ADD COLUMN some_flag integer NOT NULL DEFAULT 0;
トランザクションは30分以上続き、DBログは警告を発し始めます。
クエリを最適化する方法はありますか?
postgresqlDBとほぼ10億行のテーブルがあります。デフォルト値で新しい列を追加しようとすると:
ALTER TABLE big_table
ADD COLUMN some_flag integer NOT NULL DEFAULT 0;
トランザクションは30分以上続き、DBログは警告を発し始めます。
クエリを最適化する方法はありますか?
バッチで行う以外に(まだ時間がかかります):
テーブルをCOPYステートメントとしてダンプし、COPY ステートメントの内容を編集して別の列を挿入するスクリプトを作成できます (COPY は CSV IIRC にすることができます)。
COPY
次に、変更されたダンプをリロードするだけで、 ALTER
COPY はトランザクションをログに記録しないため、理論的には よりも高速になるはずです。
もう1つのオプションは、コマンドの実行中にオフfsync
にすることです...忘れずにオンに戻してください。
上記の両方をバッチで実行することもできます。
デフォルトなしで列を作成し、断続的なコミットで行をバッチで手動で更新してデフォルトを適用することを検討します。