Как добавить столбец в таблицу на производстве PostgreSQL с нулевым временем простоя? - PullRequest
0 голосов
/ 30 апреля 2020

Здесь { ссылка } - ответ, предоставленный для Oracle 11g, у меня такой же вопрос:

Каков наилучший подход для добавления ненулевого столбца с значение по умолчанию в производственной базе данных oracle, когда эта таблица содержит миллион записей и является действующей. Создает ли он какие-либо блокировки, если мы создадим столбец, добавив значение по умолчанию и сделав его не пустым в одном операторе?

, но для PostgreSQL?

1 Ответ

2 голосов
/ 30 апреля 2020

Этот предыдущий ответ в основном отвечает на ваш запрос.

Перекрестная ссылка релевантная PostgreSQL do c с исходным кодом PostgreSQL для AlterTableGetLockLevel, упомянутый в приведенном выше ответе, показывает, что ALTER TABLE ... ADD COLUMN всегда будет получать блокировку таблицы ACCESS EXCLUSIVE, исключая доступ любой другой транзакции к таблице в течение операции ADD COLUMN. Этот же эксклюзивный замок получается для любого варианта ADD COLUMN; ie. не имеет значения, добавляете ли вы столбец NULLDEFAULT или без него) или NOT NULL со значением по умолчанию.

Однако, как упоминалось в связанном ответе выше, добавление * Столбец 1019 * без DEFAULT должен быть очень быстрым, поскольку эта операция просто обновляет каталог.

В отличие от этого, добавление столбца с указателем DEFAULT требует перезаписи всей таблицы в PostgreSQL 10 или Меньше. Эта операция, вероятно, займет значительное время в вашей таблице записей 1M. Согласно связанному ответу, PostgreSQL> = 11 не требует такой перезаписи для добавления такого столбца, поэтому должен работать более аналогично случаю no- DEFAULT.

Я должен добавить это для PostgreSQL 11 и выше, ALTER TABLE документы отмечают, что перезапись таблицы исключается только для энергонезависимых DEFAULT спецификаторов:

Когда столбец добавляется с помощью ADD COLUMN и указан энергонезависимый DEFAULT, значение по умолчанию оценивается во время оператора, а результат сохраняется в метаданных таблицы. Это значение будет использоваться для столбца для всех существующих строк. Если DEFAULT не указан, используется NULL. Ни в том, ни в другом случае не требуется перезапись таблицы.

Добавление столбца с изменяемым значением DEFAULT [...] потребует перезаписи всей таблицы и ее индексов. [...] Перестройка таблицы и / или индекса может занять значительное время для большой таблицы; и временно потребует удвоения дискового пространства.

...