Раздутый индекс на проде
Вопрос
Индекс на часто обновляемой таблице вырос в 4 раза больше, чем нужно данным. Как пересобрать его без блокировки записи в PostgreSQL 16?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
REINDEX INDEX CONCURRENTLY idx_name: новая копия и подменаправильный ответVACUUM FULLтолько на индексе, таблица останется доступнойREINDEX INDEX idx_name: он не блокирует ни чтение, ни записьANALYZE idx_name, чтобы пересчитать и сжать страницы индекса
Разбор
REINDEX ... CONCURRENTLY появился в PostgreSQL 12 и работает как CREATE INDEX CONCURRENTLY плюс подмена: запись в таблицу не блокируется, но операция дольше и при сбое оставляет невалидную копию (с суффиксом _ccnew), которую надо удалить. Обычный REINDEX блокирует запись в таблицу, а запросы, которые выбрали этот индекс, ждут на ACCESS EXCLUSIVE индекса. VACUUM FULL для отдельного индекса не существует, а ANALYZE только собирает статистику. Причину раздувания (долгие транзакции, мешающие очистке) стоит найти отдельно.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.