MySQLの最近のバージョン(InnoDBを使用) テーブルを排他的にロックせずに多くのテーブル変更クエリをサポート 。
PostgreSQLはこれを任意のレベルでサポートしていますか?つまり、(パフォーマンスが低下している場合でも)テーブルに行を同時に読み書きしながら、テーブルに列を追加/ドロップできますか?
TL; DR:いいえ、一部の基本的なケースを除きます。
PostgreSQL 9.5には、ALTER TABLEのロック強度の削減がいくつか追加されています。ただし、9.5以下では、排他ロックなしで完全なテーブルの書き換えを必要とすることはできません。
DEFAULT
とALTER TABLE ... DROP COLUMN
を使用しないALTER TABLE ... ADD COLUMN ...
またはNOT NULL
などの一部の操作は、古いバージョンでも非常に短い排他ロックで実行できます。クエリが実行されない短い時間が必要ですが、テーブルの書き換えが必要ないため、ほとんど瞬間的です。
ALTER TABLE ... ADD COLUMN ... DEFAULT ... NOT NULL
のように、古い行のデフォルトをテーブルのメタデータに格納し、古い行を読み取るときにそれを検索することで、最適化できるものがあります。これはPostgreSQLでは実装されていません。
理論的には、PostgreSQLはMVCCカタログを使用して、古いバージョンのクエリを引き続き使用しながら、新しいバージョンの行をテーブルにバックグラウンドで書き込むことで、記述内容をサポートできます。 PostgreSQLのコードは現在、テーブルの行は常に一度に1つの構造しかないと想定しているため、特別な処理が必要になることはありません。