PostgreSQL 11 の改善点として、ALTER TABLE で NOT NULL DEFAULT ‘blah’ な ADD COLUMN したときのパフォーマンスが改善されているということを知った。大きめのテーブルに列を追加するときは結構死活問題で、地道なワークアラウンドを強要されていた。これで解決するならとても嬉しいということで、一つ試してみることにした。
手順はこんな感じ:
- PostgreSQL 10 と 11 の環境をローカルに用意
- それぞれに
x integer not null
な列を持つtable1
を定義 table1
に 100 万レコード追加table1
にADD COLUMN y integer not null default 1
なALTER TABLE
を発行- これを計測
結果は以下:
バージョン | 時間 (ms) |
---|---|
PostgreSQL 10 (10.4) | 653.094 |
PostgreSQL 11 (11.8) | 5.971 |
素晴らしい。条件が変われば多少の違いは出るだろうが、ここまで違えば決定的に速いと言えるのでは。 なぜ速くなるかは先の記事が詳しいのでここでは割愛。
以下、計測作業時のログ:
Ver 10.4
postgres=# \d table1
Table "public.table1"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
x | integer | | not null |
postgres=# select count(*) from table1;
count
---------
1000000
(1 row)
postgres=# \timing
Timing is on.
postgres=# alter table table1 add column y integer not null default 1;
ALTER TABLE
Time: 653.094 ms
Ver 11.8
postgres=# \d table1
Table "public.table1"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
x | integer | | not null |
postgres=# select count(*) from table1;
count
---------
1000000
(1 row)
postgres=# \timing
Timing is on.
postgres=# alter table table1 add column y integer not null default 1;
ALTER TABLE
Time: 5.971 ms