CREATE INDEX CONCURRENTLY: подводные камни
Вопрос
Что верно про CREATE INDEX CONCURRENTLY в PostgreSQL?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Его можно выполнить в транзакции миграции вместе с другими командами
- Он строится быстрее обычного, потому что использует параллельных воркеров
- При ошибке он откатывается полностью и ничего после себя не оставляет
- Не блокирует запись, но не идёт в транзакции и может оставить INVALIDправильный ответ
Разбор
Обычный CREATE INDEX блокирует запись в таблицу (блокировка SHARE) на всё время построения. CONCURRENTLY строит индекс в несколько проходов и ждёт завершения транзакций, которые могут его не учитывать, поэтому идёт дольше, зато INSERT, UPDATE и DELETE продолжают работать. Ограничения: нельзя внутри BEGIN ... COMMIT (инструменты миграций нужно явно просить не оборачивать такую миграцию в транзакцию), а при ошибке, например нарушении уникальности, остаётся невалидный индекс: он не используется для чтения, но обновляется при записи. Его находят по pg_index.indisvalid = false и удаляют через DROP INDEX CONCURRENTLY.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Новая колонка с DEFAULT на большой таблице
Следующий вопрос
Удалить 300 млн старых строк из живой таблицы
Термины по теме
Ещё по теме «Проектирование и нормализация»
- Нарушение второй нормальной формы
- Транзитивная зависимость
- Денормализация
- Нормализация
- Суррогатный ключ
- Связь многие ко многим
- Тип для денег
- ON DELETE CASCADE