Varreduras sequenciais vs varreduras por índice
Saiba quando uma varredura sequencial é suficiente, quando uma varredura por índice é necessária e como o planejador decide.
Varreduras sequenciais vs varreduras por índice é 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.
Duas Formas de Encontrar Linhas
O banco de dados tem duas estratégias básicas para ler linhas:
- Varredura sequencial — lê todas as páginas da tabela
- Varredura de índice — percorre um índice e busca as linhas correspondentes
Quando a Varredura Sequencial é Adequada
Se você precisa de grande parte da tabela de qualquer forma, fazer a varredura é mais barato do que ler o índice E buscar cada linha correspondente. Aproximadamente: mais de ~10–20% das linhas → a varredura sequencial vence.
Quando a Varredura de Índice Vence
Para consultas seletivas (uma pequena fração das linhas), o índice compensa:
EXPLAIN SELECT * FROM users WHERE id = 42;
-- Index Scan using users_pkey (cost=0.43..8.45 rows=1)
EXPLAIN SELECT * FROM users WHERE active;
-- Seq Scan on users (cost=0.00..15000.00 rows=950000)
-- (because most users are active)Varredura de Índice vs. Varredura Somente por Índice
Às vezes, o próprio índice contém todas as colunas necessárias — não é preciso buscar dados na tabela. Essa é a varredura somente por índice:
CREATE INDEX users_email_id_idx ON users(id) INCLUDE (email);
EXPLAIN SELECT email FROM users WHERE id = 42;
-- Index Only Scan using users_email_id_idxVarredura de Índice por Bitmap
Para seletividade média, PostgreSQL pode criar um bitmap das linhas correspondentes e depois buscá-las na ordem física — mais rápido do que fazer E/S aleatória:
EXPLAIN SELECT * FROM orders WHERE status = 'pending';
-- Bitmap Heap Scan on orders
-- Recheck Cond: (status = 'pending')
-- -> Bitmap Index Scan on orders_status_idxPor que o Planejador Escolhe a Varredura Sequencial
Motivos comuns:
- Não há índice na coluna filtrada
- O índice não pode ser usado (há uma função sobre a coluna, cláusulas OR ou incompatibilidade de tipos)
- A quantidade esperada de linhas é alta demais para que o uso de um índice valha a pena
- As estatísticas estão desatualizadas e o planejador está avaliando incorretamente a seletividade
Forçando o Uso de Índice com Cuidado
Você não pode fornecer dicas diretamente ao PostgreSQL. Em vez disso:
- Execute ANALYZE para atualizar as estatísticas
- Adicione o índice correto
- Defina parâmetros da sessão:
SET enable_seqscan = off;para diagnóstico (não em produção)
Predicados Indexáveis
Para que um índice seja útil, a cláusula WHERE precisa ser "sargable" — comparando diretamente a coluna indexada:
-- GOOD:
WHERE created_at >= '2024-01-01'
-- BAD (function on the column):
WHERE date_trunc('day', created_at) = '2024-01-01'
-- BAD (cast):
WHERE created_at::DATE = '2024-01-01'
-- FIX: add a functional index, or rewrite with range.Ordem de Índice Composto
Um índice em (a, b) ajuda consultas que usam apenas a e consultas que usam a AND b, mas não consultas que usam apenas b.
O Tamanho do Índice é Importante
Um índice B-tree estreito, com chaves frequentemente acessadas, pode permanecer totalmente na memória; um índice largo talvez não. Índices menores são mais rápidos.
Verifique o Plano
Depois de adicionar um índice, execute EXPLAIN ANALYZE para confirmar que o planejador realmente o está usando. Caso contrário, investigue.
Recapitulação
A escolha entre varredura sequencial e varredura de índice é orientada pela seletividade.
- Filtro seletivo → varredura de índice
- Maior parte da tabela → varredura sequencial
- Varredura por bitmap para os casos intermediários
- Observe a possibilidade de uso por índice
Verificação Rápida
Por que PostgreSQL pode escolher uma varredura sequencial em vez de um índice existente?
Perguntas Frequentes
A aula “Varreduras sequenciais vs varreduras por índice” é grátis?
Sim — o texto completo de “Varreduras sequenciais vs varreduras por índice” é 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 “Varreduras sequenciais vs varreduras por índice”?
Saiba quando uma varredura sequencial é suficiente, quando uma varredura por índice é necessária e como o planejador decide. 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 “Varreduras sequenciais vs varreduras por índice”?
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
- Lendo EXPLAIN e EXPLAIN ANALYZE
- Varreduras sequenciais vs varreduras por índice
- Junção por hash vs junção por intercalação vs loop aninhado
- Identificação e correção de consultas lentas