0Pricing
SQL Interview Prep · Aula

Índices de cobertura e varreduras somente de índice

Incluindo colunas para que uma consulta nunca precise acessar a área de dados da tabela.

Índices de cobertura e varreduras somente de índice é uma aula grátis de SQL Interview Prep no CoddyKit. Esta é a aula 3 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.

Relembrando a busca no heap

Anteriormente, você aprendeu que uma árvore B normal armazena apenas as colunas indexadas e um ponteiro para a linha; portanto, depois que o índice encontra as correspondências, o mecanismo ainda precisa ir até a tabela para ler as outras colunas. Essa ida é a busca no heap, e é justamente o custo que um índice de cobertura foi projetado para eliminar.

Entrevistadores perguntam sobre índices de cobertura para verificar se você entende por que um índice pode responder completamente a uma consulta sem acessar a tabela.

O que significa “cobertura”

Um índice cobre uma consulta quando todas as colunas de que ela precisa, em SELECT, WHERE, ORDER BY e GROUP BY, estão presentes no próprio índice.

Quando isso acontece, o mecanismo lê apenas o índice e nunca acessa a tabela. O PostgreSQL chama isso de varredura somente pelo índice; o SQL Server e outros sistemas chamam isso de índice de cobertura. O benefício é realizar menos leituras de páginas e executar as consultas mais rapidamente.

Exemplo prático: uma consulta coberta

Suponha que uma consulta precise apenas de customer_id e order_date. Um índice composto exatamente nessas colunas contém tudo o que a consulta solicita, portanto ela pode ser respondida somente a partir do índice.

CREATE INDEX idx_orders_cust_date
  ON orders (customer_id, order_date);

-- Covered: both selected columns are in the index
SELECT customer_id, order_date
FROM orders
WHERE customer_id = 42;

Uma coluna extra elimina a cobertura

Adicione uma coluna que o índice não contenha e a cobertura será perdida; o mecanismo terá de buscar o heap para obtê-la.

Aqui, total não está no índice; portanto, embora customer_id conduza a busca, cada linha correspondente provoca uma busca no heap para ler total.

-- NOT covered: total is not in the index, forces heap fetches
SELECT customer_id, order_date, total
FROM orders
WHERE customer_id = 42;

A cláusula INCLUDE

Você poderia adicionar total como uma quarta coluna-chave, mas, se nunca filtrar nem ordenar por ela, isso desperdiçará espaço na ordem de classificação da árvore. A ferramenta mais adequada é INCLUDE (compatível com PostgreSQL e SQL Server): ela armazena colunas extras somente nas folhas do índice, como carga útil, e não como parte da chave de ordenação.

Agora a consulta está coberta sem aumentar excessivamente a parte pesquisável do índice.

CREATE INDEX idx_orders_cust_date_inc
  ON orders (customer_id, order_date)
  INCLUDE (total);

-- Now covered: total is carried in the leaf
SELECT customer_id, order_date, total
FROM orders
WHERE customer_id = 42;

Colunas-chave versus colunas incluídas

Uma distinção precisa que impressiona os entrevistadores:

  • Colunas-chave definem a ordem de classificação e podem ser usadas para busca direcionada e varredura por intervalo. Elas obedecem à regra do prefixo mais à esquerda.
  • Colunas incluídas são armazenadas somente nas folhas como dados extras; não podem ser pesquisadas, mas permitem que o índice cubra mais consultas.

Regra prática: as colunas pelas quais você filtra ou ordena vão para a chave; as colunas que você apenas retorna vão para INCLUDE.

MySQL/InnoDB: a peculiaridade do agrupamento

Demonstre conhecimento entre diferentes dialetos. As tabelas do InnoDB (MySQL) são agrupadas pela chave primária: os índices secundários carregam implicitamente as colunas da chave primária. Portanto, um índice secundário cobre automaticamente qualquer consulta que selecione apenas as colunas indexadas e as colunas da chave primária, sem necessidade da cláusula INCLUDE (MySQL não tem INCLUDE).

O conceito de cobertura é universal; a sintaxe e as colunas adicionais implícitas variam de acordo com o mecanismo.

Verificando uma varredura somente pelo índice

Comprove a cobertura com EXPLAIN. No PostgreSQL, o nó do plano aparece como Varredura somente pelo índice, em vez de Index Scan. Procure Heap Fetches: 0 em EXPLAIN (ANALYZE); esse é o sinal definitivo de que não houve acesso à tabela.

Se você esperava uma varredura somente pelo índice, mas vê Index Scan com buscas no heap, é porque falta no índice uma coluna selecionada.

EXPLAIN (ANALYZE)
SELECT customer_id, order_date, total
FROM orders
WHERE customer_id = 42;
-- Look for: Index Only Scan ... Heap Fetches: 0

A ressalva do mapa de visibilidade do PostgreSQL

Um detalhe sutil do PostgreSQL que vale pontos extras: uma varredura somente pelo índice ainda pode acessar o heap se uma página não estiver marcada como totalmente visível no mapa de visibilidade. Depois de muitas atualizações, execute VACUUM para manter o mapa de visibilidade atualizado; caso contrário, Heap Fetches aumentará e o benefício de ser “somente pelo índice” diminuirá.

-- Keeps the visibility map fresh so index-only scans stay heap-free
VACUUM ANALYZE orders;

Quando NÃO criar um índice de cobertura amplo

Índices de cobertura não são gratuitos. Inserir muitas colunas em INCLUDE torna o índice grande, consumindo espaço de cache e tornando as escritas mais lentas, pois cada escrita relevante atualiza o índice. Apresente estes pontos ao explicar as vantagens e desvantagens:

  • São excelentes para consultas de leitura frequentes, restritas e muito acessadas.
  • São ruins quando usados como depósito para todas as colunas “por precaução”.

Cubra a consulta importante, não a linha inteira.

Como dizer isso na entrevista

Um resumo claro:

“Um índice de cobertura contém todas as colunas acessadas por uma consulta, então o mecanismo a responde apenas a partir do índice, em uma varredura somente pelo índice, ignorando a busca no heap. Coloco as colunas pesquisadas na chave e as colunas retornadas exclusivamente em INCLUDE, verifico se as buscas no heap são zero com EXPLAIN ANALYZE e mantenho o índice compacto para preservar a velocidade de escrita.”

Verificação rápida

Raciocine sobre a cobertura e o local adequado para cada coluna.

Recapitulação: índices de cobertura

Principais conclusões:

  • Um índice cobre uma consulta quando contém todas as colunas de que ela precisa, permitindo uma varredura somente pelo índice sem busca no heap.
  • As colunas-chave conduzem as buscas e seguem a regra do prefixo mais à esquerda; as colunas de INCLUDE são uma carga útil exclusiva das folhas, usada para cobertura.
  • Os índices secundários do InnoDB incluem implicitamente a chave primária.
  • Verifique com EXPLAIN (ANALYZE) e observe Heap Fetches; no PostgreSQL, mantenha VACUUM atualizado.
  • Mantenha os índices de cobertura compactos para proteger o desempenho das escritas.

A seguir: o outro lado da questão, quando os índices realmente prejudicam.

Perguntas Frequentes

A aula “Índices de cobertura e varreduras somente de índice” é grátis?

Sim — o texto completo de “Índices de cobertura e varreduras 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 “Índices de cobertura e varreduras somente de índice”?

Incluindo colunas para que uma consulta nunca precise acessar a área de dados da tabela. 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 3 de 4.

Quanto tempo leva a aula “Índices de cobertura e varreduras 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

  1. Índices B-Tree e como eles ajudam
  2. Ordem das colunas em índices compostos
  3. Índices de cobertura e varreduras somente de índice
  4. Quando os índices prejudicam: gravações e seletividade
← Voltar para SQL Interview Prep