私はどこかでALTER TABLE foo ADD COLUMN baz text
postgresデータベースでは、読み取りまたは書き込みロックは発生しません。デフォルト値を設定するとロックが発生しますが、デフォルト値をnullにするとロックできなくなります。
ただし、ドキュメントではこれを見つけることができません。これが真実であるかどうかにかかわらず、誰かが決定的に言っている場所を指すことができますか?
さまざまな種類のロックとそれらが使用されるタイミングについては、ドキュメントの Table-level Locks で説明しています。たとえば、Postgres 11のALTER TABLE
は、SHARE UPDATE EXCLUSIVE
、SHARE ROW EXCLUSIVE
、またはACCESS EXCLUSIVE
ロックを取得できます。
Postgres 9.1〜9.3は、上記の3つのうち2つをサポートすると主張していますが、実際には このコマンドのすべてのバリアントに対してAccess Exclusive
を強制 です。この制限は Postgres 9.4で解除 でしたが、ADD COLUMN
はACCESS EXCLUSIVE
のままです。
さまざまなケースでこのコマンドに必要なロックレベルの確立専用の関数があるため、ソースコードをチェックインするのは簡単です:AlterTableGetLockLevel
in src/backend/commands/tablecmds.c
。
ロックが保持される時間について、取得後:
新しいnull列を追加すると、ディスク上のすべてのデータを再書き込みする必要がないため、テーブルが非常に短時間ロックされます。デフォルト値で列を追加する場合、PostgreSQLはすべての行の新しいバージョンを作成し、それらをディスクに格納する必要があります。その間、テーブルはロックされます。
したがって、デフォルト値の列を大きなテーブルに追加する必要がある場合は、最初にnull値を追加してから、すべての行を少しずつ更新することをお勧めします。これにより、ディスクへの高負荷を回避し、autovacuumがそれを実行できるようになるため、テーブルサイズが2倍になることはありません。
http://www.postgresql.org/docs/current/static/sql-altertable.html#AEN5729
「デフォルトがnullではない列を追加するか、既存の列のタイプを変更するには、テーブル全体とインデックスを書き換える必要があります。」
したがって、ドキュメントでは、テーブルが書き換えられない場合のみを指定しています。ロックは常に存在しますが、テーブルを書き換えない場合は非常に短くなります。