Выбор ответа Middle Базы данных в эксплуатации спрашивают часто обновлено
Индекс на горячей таблице
Вопрос
Нужно добавить индекс на таблицу в 200 миллионов строк, в которую постоянно пишут. Как сделать это без остановки записи?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: CREATE INDEX CONCURRENTLY вне транзакции, затем проверить валидность. Обычный CREATE INDEX блокирует запись в таблицу на всё время построения, на 200 миллионах строк это минуты и часы.
Варианты ответа
CREATE INDEXночью: при низкой нагрузке блокировка будет короткойCREATE INDEXвнутри транзакции с уровнемSERIALIZABLE, чтобы не мешать записиCREATE INDEX CONCURRENTLYвне транзакции, затем проверить валидностьправильный ответ- Временно удалить остальные индексы таблицы, чтобы ускорить создание
Разбор
Обычный CREATE INDEX блокирует запись в таблицу на всё время построения, на 200 миллионах строк это минуты и часы. CONCURRENTLY строит индекс в несколько проходов, не блокируя запись, но дольше, не работает в транзакции и при сбое оставляет индекс INVALID, который нужно удалить и создать снова. Уровень изоляции блокировки не снимает, а удаление индексов убьёт производительность запросов.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.