Добавление индекса к большой production-таблице — классическая проблема DBA: блокировка пишущих операций на часы недопустима. PostgreSQL предлагает решение — конкурентное создание индекса.
Использование
Синтаксис создания конкурентного индекса:
CREATE INDEX CONCURRENTLY
myindex
ON mytable
... При использовании этого подхода индекс создаётся в фоновом режиме, база может работать с небольшим замедлением, но никаких ограничений на её функциональность не накладывается.
Во время создания индекс помечается как INVALID:
Postgres = # \d mytable
Table "public.mytable"
Column | Type | Modifiers
--------+---------+-----------
col | integer |
Indexes:
"myindex" btree (col) INVALID Проблемы
Асинхронность создания может привести к нарушению уникальности при создании уникальных индексов. Если процесс завершится ошибкой, индекс останется инвалидным — не участвует в запросах, но ресурсы ест.
Решение требует ручного исправления нарушений уникальности и пересоздания индекса.
Дополнительно
- Конкурентное создание индекса невозможно внутри транзакции.
- Может применяться для индексов на выражениях и частичных индексов.