CREATE INDEX

CREATE INDEX takes a SHARE lock which blocks all writes for the duration of the index build. Use CONCURRENTLY to allow writes during the build.

The Problem

sql
-- SHARE lock, blocks all writes while index is built
CREATE INDEX idx_users_email ON users(email);

Safe Rewrite

sql
-- CONCURRENTLY: no lock on writes, index built in background
-- Must run OUTSIDE a transaction block
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_users_email ON users(email);
Important: CREATE INDEX CONCURRENTLY cannot run inside a transaction. pgfence will flag it as an error if it detects it inside a BEGIN/COMMIT block.