Выбор ответа Senior Индексы обновлено

Раздутый индекс на проде

Вопрос

Индекс на часто обновляемой таблице вырос в 4 раза больше, чем нужно данным. Как пересобрать его без блокировки записи в PostgreSQL 16?

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

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

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

Коротко

Правильный ответ: REINDEX INDEX CONCURRENTLY idxname: новая копия и подмена. REINDEX ...

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

  1. REINDEX INDEX CONCURRENTLY idx_name: новая копия и подменаправильный ответ
  2. VACUUM FULL только на индексе, таблица останется доступной
  3. REINDEX INDEX idx_name: он не блокирует ни чтение, ни запись
  4. ANALYZE idx_name, чтобы пересчитать и сжать страницы индекса

Разбор

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

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

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