Varredura sequencial, de índice e somente de índice
Por que o planejador escolhe cada uma delas e o que isso revela sobre sua consulta.
Varredura sequencial, de índice e somente de índice é uma aula grátis de SQL Interview Prep 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 Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Interview Prep inclui 4 aulas no total.
Três maneiras de ler uma tabela
Quando o planejador precisa de linhas de uma tabela, ele escolhe um dos três métodos de acesso, e os entrevistadores esperam que você nomeie todos:
- Varredura sequencial, lê todas as linhas da tabela do início ao fim.
- Varredura por índice, percorre um índice para encontrar as linhas correspondentes e depois busca cada uma na tabela.
- Varredura somente pelo índice, responde inteiramente a partir do índice, sem acessar a tabela.
Saber por que o planejador escolhe cada método é o núcleo desta lição e uma pergunta garantida para candidatos experientes.
O que faz uma varredura sequencial
Uma varredura sequencial lê as páginas da tabela uma após a outra e aplica qualquer filtro a cada linha. Nenhum índice é consultado.
Isso parece ruim, mas geralmente é a escolha certa. Leituras sequenciais são rápidas para o disco (não há saltos aleatórios); portanto, quando uma consulta retorna uma grande parte da tabela, ler tudo é melhor do que percorrer um índice milhões de vezes.
O exemplo: varrer orders e manter as linhas em que amount > 100. Se a maioria dos pedidos ultrapassar 100, a varredura sequencial será correta.
EXPLAIN SELECT * FROM orders WHERE amount > 100;
Seq Scan on orders (cost=0.00..18334.00 rows=900000 width=64)
Filter: (amount > 100)O que faz uma varredura por índice
Uma varredura por índice usa uma árvore B para saltar diretamente para as chaves correspondentes e depois lê as linhas correspondentes no armazenamento da tabela.
Ela é excelente quando o filtro é seletivo, retornando uma pequena parte da tabela. Buscar 5 linhas por meio de um índice é melhor do que ler 10 milhões.
O plano informa o índice utilizado. Cada correspondência custa uma busca no índice mais uma leitura no armazenamento da tabela (uma leitura aleatória); por isso, as varreduras por índice perdem sua vantagem quando retornam linhas demais.
EXPLAIN SELECT * FROM orders WHERE customer_id = 42;
Index Scan using idx_orders_customer on orders
(cost=0.42..38.50 rows=12 width=64)
Index Cond: (customer_id = 42)A seletividade decide a escolha
O conceito único que orienta tudo isso é a seletividade: qual fração das linhas um predicado mantém.
- Alta seletividade (poucas linhas correspondem, como no caso de um identificador exclusivo) favorece uma varredura por índice.
- Baixa seletividade (muitas linhas correspondem, como em
status IS NOT NULL) favorece uma varredura sequencial.
Uma regra prática comum: quando uma consulta retorna mais de aproximadamente 5 a 10 por cento de uma tabela, o planejador costuma preferir uma varredura sequencial, pois as leituras aleatórias do armazenamento causadas pelo índice se tornam mais caras do que ler tudo em ordem.
A varredura somente pelo índice
Uma varredura somente pelo índice é a mais rápida das três. Se todas as colunas necessárias para a consulta já estiverem no índice, o mecanismo nunca acessará o armazenamento da tabela.
A consulta de exemplo seleciona apenas customer_id e filtra por essa coluna, e o índice está em customer_id. Todos os dados necessários estão no índice, por isso o Postgres informa Index Only Scan.
Isso evita as leituras aleatórias do armazenamento que tornam mais lenta uma varredura comum por índice, uma grande vantagem em tabelas largas.
EXPLAIN SELECT customer_id FROM orders WHERE customer_id = 42;
Index Only Scan using idx_orders_customer on orders
(cost=0.42..8.44 rows=12 width=4)
Index Cond: (customer_id = 42)A pegadinha do mapa de visibilidade
Os entrevistadores adoram essa nuance. Mesmo uma varredura somente pelo índice ainda precisa confirmar se cada linha está visível para a sua transação (MVCC), e o índice, por si só, não armazena informações de visibilidade.
O Postgres usa o mapa de visibilidade: se uma página estiver marcada como totalmente visível, ele ignora a tabela; caso contrário, ainda precisa buscar a linha na tabela. O plano mostra Heap Fetches: N.
Por isso, uma tabela recém-atualizada pode apresentar muitas buscas na tabela e tornar lentas as varreduras somente pelo índice até que VACUUM atualize o mapa de visibilidade.
Index Only Scan using idx_orders_customer on orders
(actual time=0.01..0.03 rows=12 loops=1)
Heap Fetches: 0Varreduras por mapa de bits: o meio-termo
Há um quarto método que aparece com frequência: a varredura de tabela por mapa de bits. O planejador o escolhe quando um predicado corresponde a mais linhas do que uma varredura comum por índice processaria, mas a menos linhas do que uma tabela inteira.
Primeiro, ele cria um mapa de bits das localizações das linhas correspondentes a partir do índice (varredura de índice por mapa de bits) e depois busca as páginas da tabela em ordem física, em vez de uma ordem aleatória. As buscas ordenadas são muito mais baratas do que as leituras dispersas de uma varredura comum por índice.
Bitmap Heap Scan on orders (cost=12.0..520.0 rows=8000)
Recheck Cond: (status = 'pending')
-> Bitmap Index Scan on idx_orders_status
(cost=0..12 rows=8000)
Index Cond: (status = 'pending')Por que o planejador ignorou seu índice
Uma pergunta clássica de entrevista: adicionei um índice, mas o plano ainda faz uma varredura sequencial; por quê? Motivos comuns:
- O predicado não é seletivo; fazer a varredura é realmente mais barato.
- Uma função envolve a coluna:
WHERE lower(email) = ...não pode usar um índice comum ememail. - Uma incompatibilidade de tipos força uma conversão implícita que impede o uso do índice.
- Estatísticas desatualizadas; execute
ANALYZE. - A tabela é minúscula; varrer algumas páginas é melhor do que arcar com a sobrecarga do índice.
Diagnóstico detalhado
Suponha que orders tenha um índice em created_at, mas esta consulta ainda faça uma varredura sequencial:
O problema é DATE(created_at). Envolver a coluna em uma função significa que o índice na coluna original created_at não pode ser usado. A solução é reescrever a consulta como um predicado de intervalo que deixe a coluna sem alterações, ou criar um índice de expressão em DATE(created_at).
-- Slow: function on the indexed column
WHERE DATE(created_at) = '2026-01-01'
-- Fast: bare column, range uses the index
WHERE created_at >= '2026-01-01'
AND created_at < '2026-01-02'Comparando os métodos
Tenha esta comparação em mente para a entrevista:
- Varredura sequencial, melhor ao retornar uma grande fração das linhas; E/S sequencial.
- Varredura por índice, melhor para buscas seletivas; percorre o índice e faz buscas aleatórias no armazenamento da tabela.
- Varredura de tabela por mapa de bits, quantidade intermediária de correspondências; transforma o índice em um mapa de bits e depois faz leituras ordenadas das páginas da tabela.
- Varredura somente pelo índice, mais rápida quando o índice contém todas as colunas necessárias e as páginas estão totalmente visíveis.
O planejador escolhe com base no custo estimado, determinado principalmente pela seletividade e pelas estatísticas.
Forçando um teste (e por que não em produção)
Para comprovar uma ideia durante o desenvolvimento, você pode influenciar temporariamente o planejador: SET enable_seqscan = off; faz com que ele prefira índices, permitindo comparar os planos.
Este é um truque diagnóstico, nunca uma solução para produção. Mencione nas entrevistas que as soluções reais são estatísticas melhores, um índice adequado ou a reescrita do predicado, e não a desativação global dos recursos do planejador.
SET enable_seqscan = off;
EXPLAIN ANALYZE SELECT * FROM orders WHERE amount > 100;
SET enable_seqscan = on;Verificação rápida
Uma consulta seleciona apenas email e filtra por email, e existe um índice de árvore B em email. O plano mostra Index Only Scan. Por que isso é mais rápido do que uma varredura comum por índice?
Recapitulação
Principais conclusões sobre os métodos de acesso:
- A varredura sequencial é melhor para consultas de baixa seletividade; a varredura por índice é melhor para consultas seletivas.
- A varredura somente pelo índice evita o armazenamento da tabela quando o índice contém todas as colunas necessárias; observe
Heap Fetchese o mapa de visibilidade. - A varredura de tabela por mapa de bits preenche a lacuna intermediária ao buscar as páginas da tabela em ordem física.
- O planejador decide com base na seletividade e nas estatísticas; funções aplicadas às colunas, incompatibilidades de tipos e estatísticas desatualizadas são os motivos pelos quais um índice é ignorado.
Perguntas Frequentes
A aula “Varredura sequencial, de índice e somente de índice” é grátis?
Sim — o texto completo de “Varredura sequencial, de índice e somente de í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 Interview Prep, atualize para CoddyKit PRO. O curso de SQL Interview Prep inclui 4 aulas no total.
O que vou aprender em “Varredura sequencial, de índice e somente de índice”?
Por que o planejador escolhe cada uma delas e o que isso revela sobre sua consulta. Você pratica SQL Interview Prep 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 Interview Prep?
Nenhuma experiência prévia é necessária. SQL Interview Prep 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 “Varredura sequencial, de índice e somente de í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 Interview Prep?
Sim. Cada aula de SQL Interview Prep 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 um plano EXPLAIN
- Varredura sequencial, de índice e somente de índice
- Algoritmos de junção: loop aninhado, hash e mesclagem
- Identificando e corrigindo consultas lentas