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);