AdTech AI PostgreSQL О компании
PostgreSQL · Индексы 14 февраля, 2025 Сергей Томулевич

Конкурентное создание индекса

Решение проблемы добавления индексов к большим таблицам на production. CREATE INDEX CONCURRENTLY: использование, ограничения, проблемы инвалидных индексов.

Добавление индекса к большой 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

Проблемы

Асинхронность создания может привести к нарушению уникальности при создании уникальных индексов. Если процесс завершится ошибкой, индекс останется инвалидным — не участвует в запросах, но ресурсы ест.

Решение требует ручного исправления нарушений уникальности и пересоздания индекса.

Дополнительно

Нужна оптимизация PostgreSQL? Расскажем, как ускорить запросы и настроить инфраструктуру под нагрузку.

to@prototypes.ventures