0Pricing
SQL Academy · Aula

Í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:

  1. Primeira passagem: cria o índice a partir das linhas atuais
  2. 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

  1. Migrações on-line: por que ALTER TABLE bloqueia
  2. Índices concorrentes (CREATE INDEX CONCURRENTLY)
  3. Renomeação de colunas sem indisponibilidade
  4. Ferramentas: Flyway, Liquibase, Sqitch
← Voltar para SQL Academy