Banco de Dados II — 2026.2

Módulo 3
Árvore B+

👨‍🏫 Prof. Gustavo Pinto 🏛️ UFPA 📅 6 de outubro de 2026 🕐 7h30 – 9h

Tabela com 10 milhões de alunos.
SELECT * FROM aluno WHERE id = 42 lê quantas páginas?

sem índice    lê a tabela inteira, página por página     cerca de 20.000
com índice    desce uma árvore até a chave 42                          3

O M1 guardou os registros, e o M2 evitou ler a mesma página duas vezes. Falta saber qual página ler.

Por que não uma árvore binária

  • Cada nó tem uma chave e dois filhos
  • 10 milhões de chaves pedem uns 24 níveis
  • Se cada nó está numa página, são 24 leituras de disco por busca
40 20 60 10 30 50 70 leitura 1 leitura 2 leitura 3 ⋮ ? leitura 24

A ideia da árvore B: um nó do tamanho de uma página, com centenas de chaves e centenas de filhos. A árvore fica larga e baixa.

Bayer e McCreight, Organization and Maintenance of Large Ordered Indexes, 1972.

Árvore B e árvore B+

Árvore B

30 60 10 20 40 50 70

Cada chave aparece uma vez, e o dado fica junto dela, em qualquer nível. A busca por 30 para na raiz.

Árvore B+

30 60 10 20 30 40 50 60 70

Os dados ficam só nas folhas, que são encadeadas. 30 e 60 aparecem duas vezes: na raiz, só para guiar a descida.

● página e slot do registro. Sem dado, o nó interno cabe mais filhos por página, e as folhas encadeadas leem uma faixa em ordem. É a B+ que os bancos usam, e é a que o minidb vai ter.

Nós internos e folhas

30 60 10 20 30 40 50 60 70 página 3, slot 5
  • Raiz tracejada: nó interno, só chaves para guiar a descida
  • Setas azuis: cada folha aponta para a próxima
  • ● página e slot do registro

Exercício 1

Árvore B+ com no máximo 3 chaves por nó. Insira, nesta ordem: 10, 20, 5, 30, 25, 40, 15.

Gabarito

Gabarito: a primeira divisão

No máximo 3 chaves por nó. Ordem: 10, 20, 5, 30, 25, 40, 15.

10, 20 e 5

5 10 20

Cabem numa folha só, em ordem. A folha, que também é a raiz, está cheia.

Chega o 30

5 10 20 30

Com ele seriam 4 chaves. Não cabe.

Divisão 1

20 5 10 20 30

A folha divide em [5 10] e [20 30]. O 20 sobe para uma raiz nova, e a árvore ganha o segundo nível.

Gabarito

Gabarito: a segunda divisão

No máximo 3 chaves por nó. Ordem: 10, 20, 5, 30, 25, 40, 15.

Depois da divisão 1

20 5 10 20 30

A árvore do slide anterior.

Chega o 25

20 5 10 20 25 30

25 ≥ 20, desce pela direita. A folha fica cheia.

Chega o 40

20 5 10 20 25 30 40

Também vai para a direita, e seriam 4 chaves.

Divisão 2

20 30 5 10 20 25 30 40

A folha divide em [20 25] e [30 40]. O 30 sobe, e a raiz ainda tem espaço.

Gabarito

Gabarito: a árvore final

No máximo 3 chaves por nó. Ordem: 10, 20, 5, 30, 25, 40, 15.

Chega o 15

20 30 5 10 15 20 25 30 40

15 < 20, desce pela esquerda. Cabe, e não há divisão.

Busca

WHERE id = 40

30 60 10 20 30 40 50 60 70

Na raiz, 30 ≤ 40 < 60: desce pelo filho do meio. Na folha, acha 40 e devolve página e slot. Duas páginas lidas.

WHERE id BETWEEN 20 AND 65

30 60 10 20 30 40 50 60 70

Desce até o 20, como na consulta ao lado, e segue as setas de folha em folha. Para no 70, que passou de 65.

Onde isso entra no minidb

SELECT * FROM aluno WHERE id = 42

M1  página e arquivo      lê 4096 bytes no deslocamento certo
M2  cache de páginas      entrega cada nó, da memória ou do disco
M3  árvore B+             desce três nós e devolve (página 812, slot 7)
M4  parser e catálogo     entende o texto, sabe que aluno tem índice em id
M5  executor              escolhe a varredura por índice

Cada módulo só usa o que vem antes dele. A árvore não sabe o que é SQL, e o cache não sabe o que é uma árvore. Para ele, um nó é uma página como outra qualquer.

O que temos, e o que falta

Pronto

M1 e M2
  • Registros gravados em páginas
  • Páginas lidas pelo cache

Agora

M3, entrega em 13/10
  • Achar um registro sem ler a tabela
  • Busca e inserção com divisão
  • Sem remoção

Depois

M4 a M7
  • Ler SQL e executar a consulta
  • Transações e log
  • Sobreviver ao kill -9

Quinta, 08/10: busca e inserção sem divisão. Terça, 13/10: divisão de nó. No NOTES.md, digam como vocês representaram um nó dentro da página.

Exercício 2

Parta da árvore final do exercício 1, com no máximo 3 chaves por nó. Insira, nesta ordem: 35, 45, 50, 55.