Árvores B

Post on 27-Jun-2015

558 views 1 download

description

Apresentação sobre árvores B com exemplo usando PostgreSQL

Transcript of Árvores B

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