Índices concorrentes (CREATE INDEX CONCURRENTLY)
Crie índices sem bloquear as escritas usando CREATE INDEX CONCURRENTLY e recupere-se de criações interrompidas.
Índices concorrentes (CREATE INDEX CONCURRENTLY) é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
O problema com CREATE INDEX
Um CREATE INDEX comum obtém um bloqueio SHARE — bloqueia as gravações (mas não as leituras) durante toda a criação. Em uma tabela com um bilhão de linhas, isso representa minutos de indisponibilidade para gravações.
CONCURRENTLY: a solução
CREATE INDEX CONCURRENTLY cria o índice sem bloquear as gravações:
CREATE INDEX CONCURRENTLY idx_orders_user_id ON orders(user_id);Como funciona
Duas varreduras da tabela:
- Primeira passagem: cria o índice a partir das linhas atuais
- Segunda passagem: captura as linhas alteradas durante a primeira passagem
Além disso, há uma breve espera por qualquer transação simultânea iniciada antes da criação.
Não pode ser executado dentro de uma transação
CONCURRENTLY faz COMMIT duas vezes — portanto, não pode ficar dentro de um bloco BEGIN/COMMIT explícito:
BEGIN;
CREATE INDEX CONCURRENTLY ...; -- ERROR
COMMIT;Lento, mas sem interrupção
CONCURRENTLY demora mais do que um CREATE INDEX comum (duas varreduras e esperas por bloqueios). O benefício é não haver tempo de inatividade.
Recuperação após falhas
Se CONCURRENTLY falhar (por interrupção ou erro do sistema), o índice ficará no estado INVALID:
SELECT relname FROM pg_class
WHERE relkind = 'i' AND NOT pg_index.indisvalid;
-- Fix: drop and re-create:
DROP INDEX CONCURRENTLY my_idx;
CREATE INDEX CONCURRENTLY my_idx ON ...;REINDEX CONCURRENTLY
Reconstrói sem bloquear, desde o PG 12:
REINDEX INDEX CONCURRENTLY orders_user_id_idx;
REINDEX TABLE CONCURRENTLY orders;DROP INDEX CONCURRENTLY
Também não bloqueia:
DROP INDEX CONCURRENTLY old_idx;Índices UNIQUE
Índices UNIQUE também podem ser criados com CONCURRENTLY. Isso é útil para adicionar restrições UNIQUE sem interrupção:
CREATE UNIQUE INDEX CONCURRENTLY users_email_uidx ON users(email);
ALTER TABLE users ADD CONSTRAINT users_email_unique UNIQUE USING INDEX users_email_uidx;Índices de chaves estrangeiras
Padrão comum ao adicionar uma FK a uma tabela grande:
-- 1. Build the index online:
CREATE INDEX CONCURRENTLY orders_user_id_idx ON orders(user_id);
-- 2. Add the FK with NOT VALID (instant):
ALTER TABLE orders ADD CONSTRAINT orders_user_fk
FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
-- 3. Validate in the background:
ALTER TABLE orders VALIDATE CONSTRAINT orders_user_fk;Custo da criação simultânea de índices
Duas varreduras completas da tabela, além do controle interno. Consome CPU e IO. Sempre que possível, execute durante os períodos de menor tráfego.
Monitorar o progresso
O PG 12+ expõe o progresso em pg_stat_progress_create_index:
SELECT phase,
blocks_done, blocks_total,
tuples_done, tuples_total
FROM pg_stat_progress_create_index;Resumo
CONCURRENTLY é a forma adequada para produção de gerenciar índices.
- CREATE/DROP/REINDEX CONCURRENTLY não bloqueiam as gravações
- Não podem ficar dentro de uma transação
- As falhas deixam índices INVALID — faça a limpeza
- Monitore com pg_stat_progress_create_index
Verificação rápida
Por que CREATE INDEX CONCURRENTLY não pode ser executado dentro de um bloco BEGIN/COMMIT explícito?
Perguntas Frequentes
A aula “Índices concorrentes (CREATE INDEX CONCURRENTLY)” é grátis?
Sim — o texto completo de “Índices concorrentes (CREATE INDEX CONCURRENTLY)” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “Índices concorrentes (CREATE INDEX CONCURRENTLY)”?
Crie índices sem bloquear as escritas usando CREATE INDEX CONCURRENTLY e recupere-se de criações interrompidas. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Índices concorrentes (CREATE INDEX CONCURRENTLY)”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Migrações on-line: por que ALTER TABLE bloqueia
- Índices concorrentes (CREATE INDEX CONCURRENTLY)
- Renomeação de colunas sem indisponibilidade
- Ferramentas: Flyway, Liquibase, Sqitch