PostgreSQL 11 でパフォーマンス改善された ALTER TABLE を試す

PostgreSQL 11 の改善点として、ALTER TABLE で NOT NULL DEFAULT ‘blah’ な ADD COLUMN したときのパフォーマンスが改善されているということを知った。大きめのテーブルに列を追加するときは結構死活問題で、地道なワークアラウンドを強要されていた。これで解決するならとても嬉しいということで、一つ試してみることにした。

手順はこんな感じ:

  1. PostgreSQL 10 と 11 の環境をローカルに用意
  2. それぞれに x integer not null な列を持つ table1 を定義
  3. table1 に 100 万レコード追加
  4. table1ADD COLUMN y integer not null default 1ALTER 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