Новая колонка с DEFAULT на большой таблице
Вопрос
Таблица на 300 млн строк. Что произойдёт при ALTER TABLE orders ADD COLUMN source text NOT NULL DEFAULT 'web' в PostgreSQL 16?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Изменится только каталог: значение хранится в метаданныхправильный ответ
- Таблица будет переписана целиком под блокировкой, это займёт часы
- Команда упадёт: нельзя добавить NOT NULL колонку в непустую таблицу
- Значение
'web'запишется в строки фоновым процессом после коммита
Разбор
Начиная с PostgreSQL 11 добавление колонки с неизменчивым (не volatile) значением по умолчанию не переписывает таблицу: значение хранится в каталоге и подставляется при чтении старых строк. NOT NULL при этом выполняется автоматически, потому что у всех строк есть значение. Переписывание будет, если значение по умолчанию volatile, например clock_timestamp() или gen_random_uuid(), ведь у каждой строки оно своё. Блокировка ACCESS EXCLUSIVE всё равно берётся, хоть и ненадолго, так что lock_timeout не помешает. Фонового заполнения в PostgreSQL нет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Проектирование и нормализация»
- Нарушение второй нормальной формы
- Транзитивная зависимость
- Денормализация
- Нормализация
- Суррогатный ключ
- Связь многие ко многим
- Тип для денег
- ON DELETE CASCADE