Saltar para o conteúdo

professor Índices B-tree em SQL

pronto 7 lições Postgres 17 · SQLite

Índices B-tree em SQL

Porque é que um índice acelera umas queries e outras não — e como decidir, com números, em vez de por hábito. Todos os planos, tamanhos e tempos deste curso foram medidos numa base de treino que tu podes reproduzir em dois comandos.

O que vais conseguir fazer no fim

O que este curso não é

O que assumi

Do diagnóstico. Cada pressuposto traz o que muda se estiver errado — se algum não bater contigo, diz, porque há lições que mudam por causa disso.

Assumi que…De onde veioSe estiver errado…
⚠️ O critério de sucesso: dado um esquema, uma query e o seu plano, dizes que índice falta e o que esperas que mude — sem consultar Assunção declarada. Eram cinco perguntas no diagnóstico e usei quatro; esta não cheguei a fazer Muda o teste de domínio e os exercícios de diagnóstico das lições 3 e 5
Escreves JOINs e agregações sem esforço, mas índice é caixa preta Resposta do diagnóstico Se souberes mais, salta a lição 0 e começa na 1. Se souberes menos, a lição 0 tem de crescer
Postgres é o principal; SQLite é a alternativa para estudar sem servidor à mão Resposta do diagnóstico Se for MySQL, muda bastante: o InnoDB agrupa a tabela pelo índice primário, e a lição 2 (do índice à linha) tem de ser reescrita
Tabelas até alguns milhões de linhas Assunção declarada Acima disso entram particionamento e outras estratégias, que este curso não cobre
~1 hora por semana, sem prazo Resposta do diagnóstico É o que justifica a divisão em núcleo e extensão, e o que torna o calendário de revisão a peça central em vez de um acessório

O mapa

A lição 0 existe porque o diagnóstico disse «índices quase zero»: sem a noção de página e de custo, tudo o resto vira regras decoradas. Não é uma nota de rodapé — é por onde se começa.

Mapa das sete lições e as suas dependências As lições 0 a 3 formam o núcleo, em cadeia: páginas e custo, a B-tree por dentro, do índice à linha, e seletividade. Da lição 3 partem as três lições de extensão: índices compostos, ler o EXPLAIN, e o custo do outro lado. A tabela seguinte repete esta informação em texto. NÚCLEO — depois destas quatro já consegues diagnosticar o caso comum 0 · páginas e custo 1 · a B-tree por dentro 2 · do índice à linha 3 · seletividade e estatísticas EXTENSÃO — desenho de esquemas e diagnóstico de casos difíceis 4 · índices compostos ordem das colunas 5 · ler o EXPLAIN diagnóstico a sério 6 · o custo do outro lado escritas, parciais, expressão teste de domínio · flashcards · revisão
As quatro do núcleo são uma cadeia: cada uma precisa da anterior. As três de extensão partem todas da lição 3 e podem ser feitas por qualquer ordem.

O plano no tempo

Distribuído por ~1 hora por semana, que foi o ritmo declarado. Sete semanas para tudo; quatro para um ponto de chegada honesto.

SemanaLiçãoDepende deO que passas a conseguir fazer
10 · Páginas, custo e o que o planeador minimiza núcleoCalcular o custo de um Seq Scan à mão
21 · A B-tree por dentro núcleolição 0Prever quantas leituras custa localizar um valor
32 · Do índice à linha núcleolição 1Distinguir as três estratégias de acesso num plano
43 · Seletividade, estatísticas e correlação núcleolição 2Descobrir porque é que um índice não está a ser usado
Fim do núcleo. Entrega as respostas, importa o revisao.ics, e decide se continuas agora ou mais tarde.
54 · Índices compostos e a ordem das colunas extensãolição 3Desenhar um índice composto e justificar a ordem
65 · Ler o EXPLAIN a sério extensãolição 3Encontrar onde está o tempo num plano grande
76 · O custo do outro lado extensãolição 3Defender a decisão de não indexar, com números

Preparar o ambiente

Os exercícios correm mesmo. Precisas da base de treino — 1 000 000 de linhas, ~87 MB, cria-se em segundos:

createdb treino_indices
psql -d treino_indices -f preparar.sql

O ficheiro é preparar.sql. Precisas também de:

psql -d treino_indices -c "CREATE EXTENSION IF NOT EXISTS pageinspect;"
⭐ Sem Postgres à mão?

A maior parte dos exercícios tem variante SQLite, indicada em cada lição. O que muda é o vocabulário — EXPLAIN QUERY PLAN em vez de EXPLAIN ANALYZE, SCAN e SEARCH em vez de Seq Scan e Index Scan, USING COVERING INDEX em vez de Index Only Scan. O mecanismo é o mesmo.

⚠️ O que o SQLite não te dá: contagem de páginas (BUFFERS), estatísticas de distribuição visíveis, e a distinção entre Index Scan e Bitmap Heap Scan. As lições 3 e 5 perdem bastante sem Postgres.

No fim do tópico

Nota das fases

O que cada fase do processo encontrou. Está aqui porque é isto que distingue um curso que passou pelo processo de um que parece ter passado.

Fase 0 — Verificar

Procurei em docs/ e topicos/ por: «b-tree», «índice», «index», «query», «lenta», «desempenho», «seletividade»; no INDICE.md; e com git log -S "b-tree".

Encontrei: nada. Este é o primeiro tópico do repositório, que tinha zero commits. Não há pré-requisitos por cobrir noutro tópico nem vizinhos com que declarar fronteira — a fronteira declarada acima é, por agora, contra tópicos que não existem e que ficam nomeados para quando existirem (indices-nao-btree-sql, e um sobre o InnoDB).

Fontes primárias localizadas: a documentação do PostgreSQL 17 (tipos de índice, multicolumn, index-only scans, visibility map, parciais, de expressão, volatilidade de funções, uso do EXPLAIN, constantes de custo, estatísticas do planeador). Uma fonte secundária identificada como tal: Use The Index, Luke!.

Fase 1 — Criar

Sete lições, folha, teste, flashcards e calendário. Decisões tomadas durante a escrita:

Fase 2 — Aprofundar

O que a Fase 1 errou:

Fase 3 — Validar

Resolvi todos os exercícios e o teste do zero, corri todo o código, e conferi cada afirmação factual contra a documentação aberta na altura. O que isso apanhou: