Varreduras somente por índice e mapa de visibilidade
Habilite varreduras somente por índice fazendo com que os índices cubram as consultas e mantendo o mapa de visibilidade atualizado.
Varreduras somente por índice e mapa de visibilidade é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 4 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 que é uma varredura somente pelo índice?
Normalmente, uma busca no índice retorna identificadores de linhas (TIDs), e é necessário acessar a tabela para ler a linha real. Varredura somente pelo índice responde à consulta usando apenas o índice — sem acessar a tabela. É muito mais rápida.
Condições
Uma varredura somente pelo índice exige:
- Todas as colunas selecionadas devem estar no índice
- A página da linha deve estar marcada como "toda visível" no mapa de visibilidade
Mapa de visibilidade
Um mapa de bits para cada página da tabela: um bit definido significa que "todas as linhas desta página estão visíveis para todas as transações". O VACUUM o mantém atualizado. Sem ele, o PostgreSQL precisa acessar a tabela para verificar a visibilidade.
Tornando uma consulta somente pelo índice
Inclua todas as colunas necessárias:
-- Query:
SELECT id, email FROM users WHERE id = 42;
-- Without an index on (id, email), only an Index Scan that visits the heap is possible.
-- With this:
CREATE INDEX users_id_email_idx ON users (id, email);
-- Or better:
CREATE INDEX users_id_email_idx ON users (id) INCLUDE (email);
-- The query can be index-only.INCLUDE
Índice de cobertura com colunas que não são chaves (PG 11+). A coluna é armazenada nas folhas, mas não é usada para ordenação — não afeta o custo de inserção:
CREATE INDEX users_id_idx ON users(id) INCLUDE (email, full_name);
SELECT id, email, full_name FROM users WHERE id = 42;
-- Index-only scan if visibility map allows.Por que ainda pode ser necessário acessar a tabela
Depois de muitas gravações, o mapa de visibilidade pode estar desatualizado. Execute VACUUM (sem FULL) para atualizá-lo.
VACUUM (VERBOSE) users;
-- "scanned X pages, X of which are visible"
-- More visible pages = more Index-Only Scans possible.Verificando varreduras somente pelo índice
EXPLAIN revela isso:
EXPLAIN ANALYZE
SELECT id, email FROM users WHERE id = 42;
-- Index Only Scan using users_id_email_idx on users
-- Index Cond: (id = 42)
-- Heap Fetches: 0 ← key numberO que as buscas na tabela informam
"Buscas na tabela: 0" — perfeito, todos os dados vieram do índice. "Buscas na tabela: N" — N linhas precisaram de acesso à tabela (o bit do mapa de visibilidade não estava definido). Depois da execução do VACUUM automático, as buscas na tabela geralmente diminuem.
Quando usar INCLUDE em vez de um índice composto
- Use INCLUDE para colunas que só são selecionadas, e não usadas para filtrar ou ordenar
- Use um índice composto (de chave) quando a coluna também for usada para filtrar ou ordenar
INCLUDE mantém o índice mais estreito e acelera as gravações.
O inchaço do índice prejudica as varreduras somente pelo índice
Índices inchados têm mais páginas, portanto até as varreduras somente pelo índice leem mais dados. Mantenha os índices submetidos ao VACUUM e reindexe-os quando o inchaço ficar alto.
Não inclua tudo
Adicionar colunas demais a um índice torna as gravações lentas e deixa o índice enorme. Inclua apenas os caminhos de leitura mais utilizados.
Visões materializadas como cobertura
Se quiser uma velocidade de leitura extrema para um relatório específico, uma visão materializada + um índice funcionam essencialmente como um "índice de cobertura" com colunas calculadas arbitrárias.
Recapitulação
A varredura somente pelo índice é o caminho de leitura mais rápido.
- Todas as colunas selecionadas devem estar no índice
- INCLUDE adiciona colunas que não são chaves a baixo custo
- O mapa de visibilidade deve indicar "toda visível" — o VACUUM o mantém atualizado
- No EXPLAIN, o objetivo é Buscas na tabela: 0
Verificação rápida
Você vê Buscas na tabela: 100.000 no EXPLAIN, apesar de um nó de varredura somente pelo índice. Qual é a correção típica?
Aprenda SQL com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 46
- Aulas
- 183
Perguntas Frequentes
A aula “Varreduras somente por índice e mapa de visibilidade” é grátis?
Sim — o texto completo de “Varreduras somente por índice e mapa de visibilidade” é 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 somente por índice e mapa de visibilidade”?
Habilite varreduras somente por índice fazendo com que os índices cubram as consultas e mantendo o mapa de visibilidade atualizado. 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 4 de 4.
Quanto tempo leva a aula “Varreduras somente por índice e mapa de visibilidade”?
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
- MVCC e causas da fragmentação
- VACUUM, autovacuum, vacuum_cost_delay
- ANALYZE e pg_statistic
- Varreduras somente por índice e mapa de visibilidade