43

ALTER TABLE foo ADD COLUMN baz textpostgresデータベースで実行しても読み取りまたは書き込みロックが発生しないことをどこかで読んだと思います。デフォルト値を設定するとロックが発生しますが、null デフォルトを許可するとロックが防止されます。

ただし、ドキュメントでこれを見つけることができません。これが真実かどうかを明確に述べている場所を誰か指摘できますか?

4

3 に答える 3

50

さまざまな種類のロックとそれらが使用されるタイミングについては、 テーブル レベル ロックのドキュメントに記載されています。たとえば、Postgres 11は、、またはロックALTER TABLEを取得する場合があります。SHARE UPDATE EXCLUSIVESHARE ROW EXCLUSIVEACCESS EXCLUSIVE

Postgres 9.1 から 9.3 は、上記の 3 つのうち 2 つをサポートすると主張していましたが、実際にはこのコマンドのすべてのバリアントに対して強制されAccess Exclusiveていました。この制限はPostgres 9.4 で解除されましたが、設計上ADD COLUMNはそのままACCESS EXCLUSIVEです。

さまざまな場合にこのコマンドに必要なロック レベルを確立する専用の関数があるため、ソース コードを簡単にチェックインできAlterTableGetLockLevelますsrc/backend/commands/tablecmds.c


ロックが保持される時間については、一度取得すると次のようになります。

  • 列のデフォルト値が NULL の場合、列の追加は非常に迅速に行われます。これは、テーブルの書き換えが必要ないためです。これはカタログ内の更新のみです。
  • 列に NULL 以外のデフォルト値がある場合、PostgreSQL のバージョンに依存します。バージョン 11 以降では、すべての行がすぐに書き換えられるわけではないため、NULL の場合と同じくらい高速である必要があります。ただし、バージョン10以前ではテーブルをまるごと書き直すため、テーブルのサイズによってはかなりコストがかかる場合があります。
于 2013-10-22T20:02:50.907 に答える