Выбор ответа Senior Проектирование и нормализация обновлено

Новая колонка с DEFAULT на большой таблице

Вопрос

Таблица на 300 млн строк. Что произойдёт при ALTER TABLE orders ADD COLUMN source text NOT NULL DEFAULT 'web' в PostgreSQL 16?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Изменится только каталог: значение хранится в метаданных. Начиная с PostgreSQL 11 добавление колонки с неизменчивым (не volatile) значением по умолчанию не переписывает таблицу: значение хранится в каталоге и подставляется при чтении старых строк.

Варианты ответа

  1. Изменится только каталог: значение хранится в метаданныхправильный ответ
  2. Таблица будет переписана целиком под блокировкой, это займёт часы
  3. Команда упадёт: нельзя добавить NOT NULL колонку в непустую таблицу
  4. Значение 'web' запишется в строки фоновым процессом после коммита

Разбор

Начиная с PostgreSQL 11 добавление колонки с неизменчивым (не volatile) значением по умолчанию не переписывает таблицу: значение хранится в каталоге и подставляется при чтении старых строк. NOT NULL при этом выполняется автоматически, потому что у всех строк есть значение. Переписывание будет, если значение по умолчанию volatile, например clock_timestamp() или gen_random_uuid(), ведь у каждой строки оно своё. Блокировка ACCESS EXCLUSIVE всё равно берётся, хоть и ненадолго, так что lock_timeout не помешает. Фонового заполнения в PostgreSQL нет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.