PostgreSQL: CREATE INDEX CONCURRENTLY — пример построения индекса без простоя
Как создать индекс, не блокируя записи в таблицу. Показываем синтаксис CREATE INDEX CONCURRENTLY, мультиколоночный и уникальный варианты.
**Почему это важно**
Обычный CREATE INDEX берёт эксклюзивный lock, и все DML-операции ждут завершения. Опция CONCURRENTLY строит индекс в фоне: сначала сканирует таблицу, затем «догоняет» новые записи, поэтому INSERT/UPDATE/DELETE продолжают работать. Учтите, что:
* команда дольше обычной и нельзя выполнять внутри транзакции;
* при неудаче индекс нужно удалить DROP INDEX CONCURRENTLY;
* поддерживается в PostgreSQL давно, документы подчёркивают отсутствие полной блокировки
-- Индекс без блокировки (PostgreSQL ≥ 8.2)
CREATE INDEX CONCURRENTLY idx_users_created_at
ON public.users (created_at);
-- Мультиколоночный индекс
CREATE INDEX CONCURRENTLY idx_events_user_time
ON events (user_id, "time");
-- Уникальный индекс
CREATE UNIQUE INDEX CONCURRENTLY idx_products_sku_unique
ON products (sku);