0Pricing
SQL Academy · Aula

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_idx

Varredura 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_idx

Por 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

  1. Lendo EXPLAIN e EXPLAIN ANALYZE
  2. Varreduras sequenciais vs varreduras por índice
  3. Junção por hash vs junção por intercalação vs loop aninhado
  4. Identificação e correção de consultas lentas
← Voltar para SQL Academy