Перейти к содержимому
11 / 15

Безопасный DDL: какие изменения схемы блокируют таблицу и как этого избежать?

Часть DDL в PostgreSQL выполняется мгновенно, часть переписывает таблицу целиком под ACCESS EXCLUSIVE. Мгновенные: добавление колонки (в том числе с константным DEFAULT — с версии 11 значение хранится в метаданных), переименование, добавление NOT VALID-ограничения, снятие NOT NULL. Переписывают таблицу: смена типа колонки в общем случае, добавление колонки с волатильным выражением, ALTER TABLE ... SET LOGGED. Отдельная категория — операции, которые сами по себе быстры, но ждут блокировку и тем самым выстраивают за собой очередь из обычных запросов; поэтому любой DDL в проде запускают с lock_timeout и повторами. Долгие построения выносят из блокировки: CREATE INDEX CONCURRENTLY, ALTER TABLE ... ADD CONSTRAINT ... NOT VALID с последующим VALIDATE CONSTRAINT, добавление NOT NULL через CHECK NOT VALIDVALIDATESET NOT NULL.

Безопасный DDL: какие изменения схемы блокируют таблицу и как этого избежать? | JScriptiser