Выбор ответа Senior Миграции спрашивают часто обновлено

Создание индекса на большой таблице

Вопрос

Почему на большой таблице PostgreSQL индекс создают через CREATE INDEX CONCURRENTLY?

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

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

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

Коротко

Правильный ответ: Обычный CREATE INDEX блокирует запись в таблицу на время построения. Обычное построение берёт блокировку, которая запрещает INSERT, UPDATE и DELETE, и на большой таблице это минуты простоя.

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

  1. Обычный CREATE INDEX блокирует запись в таблицу на время построенияправильный ответ
  2. Обычный индекс не используется планировщиком, пока не выполнен ANALYZE
  3. CONCURRENTLY строит индекс в несколько раз быстрее за счёт параллельных воркеров
  4. Без CONCURRENTLY индекс не переживёт перезапуск базы и его придётся пересоздать

Разбор

Обычное построение берёт блокировку, которая запрещает INSERT, UPDATE и DELETE, и на большой таблице это минуты простоя. CONCURRENTLY позволяет писать в таблицу, зато строится дольше, не работает внутри транзакции и при сбое оставляет невалидный индекс, который нужно удалить. В Django для этого AddIndexConcurrently из django.contrib.postgres.operations в миграции с atomic = False.

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

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