Arvores B
Atila CamurcaSamir CoutinhoTunay Araujo
27 de junho de 2013
Sumary
1 Introducao
2 Motivacao
3 Definicao
4 Operacoes Basicas
5 Exemplo
6 Utilizacao
PostgreSQL
7 Referencias
Introducao
Sabemos que em relacao a memoria de computador existe uma hierarquiade velocidade de acesso, memorias cache e de registro sao mais velozesque memorias RAM, que sao mais velozes que HDs.
Podemos utilizar algorıtmos que especificamente sejam rapidos ao acessarHDs.
Motivacao
Quando os dados sao muito grandes para caber na memoria principal,eles devem se expandir para o disco. O acesso ao disco e muito custosoem comparacao com uma instrucao tıpica. O numero de acessos ao discovai preponderar o tempo de execucao. O objetivo das Arvores B e criaruma arvore de busca que ira minimizar os acessos ao disco.
Definicao
Arvores B sao arvores de pesquisa balanceadas projetadasespecificamente para serem armazanadas em discos magneticos.
Medimos o desempenho pela quantidade de tempo de computacao queconsomem, mas tambem pela quantidade de acesso a disco que saorealizadas.
Altura
O numero de acessos ao disco e proporcional a altura da Arvore B.O pior caso da altura de uma Arvore B e
h ≤ logtn + 1
2 ⇔ O(logt n)
Operacoes Basicas
Sempre mantemos a raız na memoria principal, assim umDISK-READ da raız nunca sera necessario.Qualquer no passado como parametro ja deve ter sofrido umDISK-HEAD.Qualquer no deve ter mudado com um DISK-WRITE.
Operacoes Basicas
O numero de execucao de um algoritmo de arvores B e determinado,principalmente, pelo numero de operacoes DISK-WRITE eDISK-READ.A quantidade de acessos ao disco e diretamente proporcional aofator de ramificacao.
Operacoes Basicas
1. B-TREE-SEARCH2. B-TREE-INSERT3. B-TREE-CREATE4. B-TREE-DELETE
B-TREE-CREATE
Para construir arvores B utilizamos B-TREE-CREATE para criar um noraiz vazio e depois chamamos B-TREE-INSERT para adicionar novaschaves. Ela exige O(1) operacoes de disco e tempo de CPU O(1).
B-TREE-INSERT
O numero de acessos a disco de B-TREE-INSERT e O(h) poisapenas O(1) operacoes disk-read/write sao feitas entre duaschamadas consecutivas de B-TREE-INSERT-NONFULL.O tempo total de cpu e O(th) = O(t logt n).
Observacao
o split na raiz e o unico jeito de aumentar a altura da arvore B. Aocontrario das arvores binarias, o crescimento se da na raiz em vez dasfolhas.
Insercao de elemento (split)
A insercao nas arvores B e relativamente mais complicada, pois,precisamos inserir a nova chave no no correto da arvore, sem violarsuas propriedades.Como procedemos se o no esta cheio?
Se estiver cheio deve separar (split) o no em torno do elementomediano, criando outros dois nos que nao violam as definicoes dearvore.O elemento mediano e promovido, passando a fazer parte do no paidaquele no.
B-TREE-SPLIT-CHILD
A nova chave sempre e inserida em uma folha.A insercao e feita em um unico percurso na arvore, a partir da raizate uma das folhas.O procedimento B-TREE-SPLIT-CHILD e usado para garantir que arecursao nunca desca em um no cheio.
B-TREE-INSERT-NONFULL
O codigo a seguir faz uso do procedimentoB-TREE-INSERT-NONFULL, que e responsavel pela insercao dachave em um no n nao cheio.B-TREE-INSERT-NONFULL, insere a chave k no no x, caso esteseja uma folha, caso contrario, procura o filho adequado e desce aele recursivamente ate encontrar a folha onde deve inserir k.
Exemplo
Exemplo
Exemplo
Exemplo
Exemplo
Exemplo
Exemplo
Exemplo
Exemplo
Exemplo
Exemplo
Exemplo
Exemplo
Exemplo
Exemplo
B-TREE-DELETE
Caso 1: envolve delecao da chave de uma folha. Restando t − 1chaves.Caso 2: se a chave k estiver no no x e x e um no interno.Caso 3: se a chave nao estiver presente no no interno x.
Utilizacao
Muitos sistemas de bancos de dados usam arvores B ou variacoes dearvores B para armazenar informacoes.
Um deles e o PostgreSQL (http://www.postgresql.org/).
PostgreSQL
PostgreSQL usa arvores B nos seus ındices (INDEX). Indices sao usadosprimariamente para aumentar a performance do banco de dados.
Alem de Arvores B o PostgreSQL oferece suporte a:
HASHGiST (Generalized Search Tree)SP-GiST (Space-Partitioned - Generalized Search Tree)GIN (Generalized Inverted Index)
PostgreSQL
Arvores B sao melhor utilizadas quando um ındice involve comparacoescomo <, <=, =, >=, >
ExemploPostgreSQL
CREATE TABLE not_indexed_table(
id integer NOT NULL)WITH (
OIDS=FALSE);ALTER TABLE not_indexed_table
OWNER TO postgres;
ExemploPostgreSQL
CREATE TABLE indexed_table(
id integer NOT NULL,CONSTRAINT indexed_table_pkey PRIMARY KEY (id)
)WITH (
OIDS=FALSE);ALTER TABLE indexed_table
OWNER TO postgres;
ExemploPostgreSQL
INSERT INTO not_indexed_table (id)SELECT GENERATE_SERIES(1, 100000);
INSERT INTO indexed_table (id)SELECT GENERATE_SERIES(1, 100000);
ExemploPostgreSQL
EXPLAIN ANALYZE SELECT COUNT(*) FROM not_indexed_table;
-- saıdaAggregate (cost=1572.00..1572.01 rows=1 width=0)
(actual time=73.198..73.198 rows=1 loops=1)-> Seq Scan on not_indexed_table(cost=0.00..1336.20 rows=94320 width=0)(actual time=0.023..38.878 rows=100000 loops=1)
Total runtime: 73.239 ms
ExemploPostgreSQL
EXPLAIN ANALYZE SELECT COUNT(*) FROM indexed_table;
-- saıdaAggregate (cost=1643.00..1643.01 rows=1 width=0)
(actual time=69.939..69.940 rows=1 loops=1)-> Seq Scan on indexed_table(cost=0.00..1393.00 rows=100000 width=0)(actual time=0.014..35.571 rows=100000 loops=1)
Total runtime: 69.974 ms
ExemploPostgreSQL
EXPLAIN ANALYZE SELECT * FROM not_indexed_tableWHERE id < 12;
-- saıdaSeq Scan on not_indexed_table
(cost=0.00..1643.00 rows=10 width=4)(actual time=0.020..17.527 rows=11 loops=1)
Filter: (id < 12)Rows Removed by Filter: 99989
Total runtime: 17.555 ms
ExemploPostgreSQL
EXPLAIN ANALYZE SELECT * FROM indexed_tableWHERE id < 12;
-- saıdaIndex Only Scan using indexed_table_pkey
on indexed_table(cost=0.00..8.45 rows=11 width=4)(actual time=0.022..0.028 rows=11 loops=1)
Index Cond: (id < 12)Heap Fetches: 11
Total runtime: 0.053 ms
ExemploPostgreSQL
Tabela Tamanho
not indexed table 3168 kB
indexed table 4936 kB
PostgreSQL
Da documentacao do PostgreSQL:
Adding a primary key will automatically create a unique btreeindex on the column or group of columns used in the primarykey.
Adicionando uma chave primaria ira automaticamente criar uma Arvore Bde ındice unico na coluna ou grupo de colunas usadas na chave primaria.
http://www.postgresql.org/docs/9.0/static/ddl-constraints.html
Referencias
http://www.depesz.com/2010/09/09/why-is-my-index-not-being-used/
http://www.thegeekstuff.com/2009/05/15-advanced-postgresql-commands-with-examples/
http://ats.oka.nu/b-tree/b-tree.manual.html
http://www.postgresql.org/docs/9.0/static/ddl-constraints.html
T. Cormen, C. Leiserson, R. Rivest, C. Stein, Algoritmos - Teoria ePratica, 2002http://www.lcad.icmc.usp.br/˜nonato/ED/B_arvore/btree.htm
http://www.di.ufpb.br/lucidio/Btrees.pdf
Top Related