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