web-dev-qa-db-ja.com

PostgreSQLはオンラインスキーマ変更(DDL)をサポートしていますか?

MySQLの最近のバージョン(InnoDBを使用) テーブルを排他的にロックせずに多くのテーブル変更クエリをサポート

PostgreSQLはこれを任意のレベルでサポートしていますか?つまり、(パフォーマンスが低下している場合でも)テーブルに行を同時に読み書きしながら、テーブルに列を追加/ドロップできますか?

4
dukebody

TL; DR:いいえ、一部の基本的なケースを除きます。

PostgreSQL 9.5には、ALTER TABLEのロック強度の削減がいくつか追加されています。ただし、9.5以下では、排他ロックなしで完全なテーブルの書き換えを必要とすることはできません。

DEFAULTALTER TABLE ... DROP COLUMNを使用しないALTER TABLE ... ADD COLUMN ...またはNOT NULLなどの一部の操作は、古いバージョンでも非常に短い排他ロックで実行できます。クエリが実行されない短い時間が必要ですが、テーブルの書き換えが必要ないため、ほとんど瞬間的です。

ALTER TABLE ... ADD COLUMN ... DEFAULT ... NOT NULLのように、古い行のデフォルトをテーブルのメタデータに格納し、古い行を読み取るときにそれを検索することで、最適化できるものがあります。これはPostgreSQLでは実装されていません。

理論的には、PostgreSQLはMVCCカタログを使用して、古いバージョンのクエリを引き続き使用しながら、新しいバージョンの行をテーブルにバックグラウンドで書き込むことで、記述内容をサポートできます。 PostgreSQLのコードは現在、テーブルの行は常に一度に1つの構造しかないと想定しているため、特別な処理が必要になることはありません。

6
Craig Ringer