Этот предыдущий ответ по существу отвечает на ваш запрос.
Перекрестные ссылки на соответствующий документ PostgreSQL с исходным кодом PostgreSQL для AlterTableGetLockLevel
, упомянутый в приведенном выше ответе, показывает, что ALTER TABLE ... ADD COLUMN
всегда будет получать блокировку таблицы ACCESS EXCLUSIVE
, препятствующую доступу любой другой транзакции к таблице на время операции ADD COLUMN
. Такая же монопольная блокировка получается для любой ADD COLUMN
вариации; т.е. не имеет значения, добавляете ли вы столбец NULL
(с DEFAULT
или без него) или имеете NOT NULL
со значением по умолчанию.
Однако, как упоминалось в связанном ответе выше, добавление столбца NULL
без DEFAULT
должно быть очень быстрым, поскольку эта операция просто обновляет каталог.
Напротив, добавление столбца со спецификатором DEFAULT
требует перезаписи всей таблицы в PostgreSQL 10 или более ранней версии. Эта операция, вероятно, займет значительное время в вашей таблице записей 1M. Согласно связанному ответу, PostgreSQL ›= 11 не требует такой перезаписи для добавления такого столбца, поэтому он должен работать более похоже на случай no-DEFAULT
.
Я должен добавить, что для PostgreSQL 11 и выше ALTER TABLE
docs обратите внимание, что перезаписи таблицы избегают только для энергонезависимых спецификаторов DEFAULT
:
Когда столбец добавляется с помощью ADD COLUMN и указывается энергонезависимое значение DEFAULT, во время оператора оценивается значение по умолчанию, а результат сохраняется в метаданных таблицы. Это значение будет использоваться для столбца для всех существующих строк. Если значение DEFAULT не указано, используется NULL. Ни в том, ни в другом случае переписывание таблицы не требуется.
Добавление столбца с изменяемым значением DEFAULT [...] потребует перезаписи всей таблицы и ее индексов. [...] Перестроение таблицы и/или индекса может занять значительное время для большой таблицы; и временно потребуется вдвое больше места на диске.
person
Timshel
schedule
30.04.2020