Выбор ответа Senior Проектирование и нормализация спрашивают часто обновлено

CREATE INDEX CONCURRENTLY: подводные камни

Вопрос

Что верно про CREATE INDEX CONCURRENTLY в PostgreSQL?

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

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

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

Коротко

Правильный ответ: Не блокирует запись, но не идёт в транзакции и может оставить INVALID. Обычный CREATE INDEX блокирует запись в таблицу (блокировка SHARE) на всё время построения.

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

  1. Его можно выполнить в транзакции миграции вместе с другими командами
  2. Он строится быстрее обычного, потому что использует параллельных воркеров
  3. При ошибке он откатывается полностью и ничего после себя не оставляет
  4. Не блокирует запись, но не идёт в транзакции и может оставить INVALIDправильный ответ

Разбор

Обычный CREATE INDEX блокирует запись в таблицу (блокировка SHARE) на всё время построения. CONCURRENTLY строит индекс в несколько проходов и ждёт завершения транзакций, которые могут его не учитывать, поэтому идёт дольше, зато INSERT, UPDATE и DELETE продолжают работать. Ограничения: нельзя внутри BEGIN ... COMMIT (инструменты миграций нужно явно просить не оборачивать такую миграцию в транзакцию), а при ошибке, например нарушении уникальности, остаётся невалидный индекс: он не используется для чтения, но обновляется при записи. Его находят по pg_index.indisvalid = false и удаляют через DROP INDEX CONCURRENTLY.

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

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