Выбор ответа Middle Базы данных в эксплуатации спрашивают часто обновлено

Индекс на горячей таблице

Вопрос

Нужно добавить индекс на таблицу в 200 миллионов строк, в которую постоянно пишут. Как сделать это без остановки записи?

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

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

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

Коротко

Правильный ответ: CREATE INDEX CONCURRENTLY вне транзакции, затем проверить валидность. Обычный CREATE INDEX блокирует запись в таблицу на всё время построения, на 200 миллионах строк это минуты и часы.

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

  1. CREATE INDEX ночью: при низкой нагрузке блокировка будет короткой
  2. CREATE INDEX внутри транзакции с уровнем SERIALIZABLE, чтобы не мешать записи
  3. CREATE INDEX CONCURRENTLY вне транзакции, затем проверить валидностьправильный ответ
  4. Временно удалить остальные индексы таблицы, чтобы ускорить создание

Разбор

Обычный CREATE INDEX блокирует запись в таблицу на всё время построения, на 200 миллионах строк это минуты и часы. CONCURRENTLY строит индекс в несколько проходов, не блокируя запись, но дольше, не работает в транзакции и при сбое оставляет индекс INVALID, который нужно удалить и создать снова. Уровень изоляции блокировки не снимает, а удаление индексов убьёт производительность запросов.

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

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

Термины по теме