Métodos de Acesso Indice estruturado por Hash. Plano Geral Vantagens e Limitações Hash Estático...

Post on 17-Apr-2015

121 views 1 download

Transcript of Métodos de Acesso Indice estruturado por Hash. Plano Geral Vantagens e Limitações Hash Estático...

Métodos de Acesso

Indice estruturado por Hash

Plano Geral Vantagens e Limitações

Hash Estático

Hash Extensível

Hash Linear

Comparação entre Hash Extensível e Linear

Vantagens e Limitações Hash : excelente para seleção por igualdade na chave . Não suporta seleção range (>, < ) B-Trees suportam seleção range e são quase tão boas quanto

Hash para igualdade. Muitos SGBDs só implementam índices estruturados por B-

Trees Técnica de indexação Hash é muito útil na implementação do

operador Junção, que inclu diversas seleções por igualdade Diferença de custo entre B-Tree e Hash é significativa

neste caso.

Hash Estático

0

1

2

N-1

h

h(chave) mod N

chave

Páginas Primárias dos Buckets

Páginas de Overflow

Entradas do tipo <chave, * >

h = função hash

Busca

0

1

2

5

h

h(14) mod 6 = 2

14

…< 14, * > h(x) = x

N = 6

4

3

….<14,* >

Inserção

0

1

2

5

h

h(7) mod 6 = 1

7

…Inserindo < 7, * >

4

3

< 7, * >

Cheia

Supressão

0

1

2

5

h

h(25) mod 6 = 1

25

…Suprimindo < 25, * >

4

3

< 25, * >

Função Hash Componente importante da técnica hash

Deve distribuir valores das chaves de maneira uniforme nos buckets.

Número de buckets = N = parâmetro

h(x) = a*x + b , a, b : parâmetros de ajuste

Custos Páginas primárias podem ser armazenadas em

páginas de disco sucessivas. Caso não haja overflow

Busca requer 1 I/O Inserção e Supressão requerem 2 I/O

Custo pode ser alto se existem muitas páginas de overflow.

Estratégia : criar inicialmente os buckets deixando 20% de área livre em cada um.

Desvantagens do Hash Estático Número de buckets é fixo

Se arquivo encolhe muito, o espaço é desperdiçado, já que os buckets são fixos.

Crescimento do arquivo produz longas cadeias de páginas de overflow, prejudicando performance da busca.

Alternativas Alternativa 1 :

Periodicamente, modificar a função hash e reestruturar todo o arquivo de modo a evitar páginas de overflow.

« Rehash » toma muito tempo Indice não pode ser utilizado durante o processo de

« rehash ». Alternativa 2 : Hash dinâmicos

Extensível Linear

Hash Extensível Solução 1 : quando algum bucket ficar cheio

Dobrar o número de buckets Distribuir as entradas nos novos buckets Defeito : o arquivo todo deve ser lido e reorganizado e o

dobro de páginas devem ser escritas. Espaço em alguns buckets é alocado bem antes de sua

utilização efetiva. Solução 2 : utilizar um diretório de ponteiros para os

buckets. Dobrar o número de entradas no diretório Separar somente os buckets que ficaram cheios.

Notação Para procurar, inserir ou suprimir entrada k*

Aplicar h(k)

h(k) identifica um bucket

Duas chaves k1 e k2 podem ter h(k1) = h(k2)

Exemplo

00

01

10

11

2

Diretório dos Ponteiros

Profundidade Global

4* 12* 32* 16*

2

1* 5* 21*

2

10*

2

15* 7* 19*

2

Bucket A

Bucket B

Bucket C

Bucket D

Páginas do Indice

Profundidade Local

Exemplo – inserção

00

01

10

11

2

Diretório

4* 12* 32* 16*

2

1* 5* 21*

2

10*

2

15* 7* 19*

2

Páginas do Indice

Inserindo 13*

13*

Exemplo – inserção

00

01

10

11

2

Diretório

4* 12* 32* 16*

2

1* 5* 21*

2

10*

2

15* 7* 19*

2

Inserindo 20*

13*

4* 12* 20*

2

32* 16*

2

Exemplo – inserção

00

01

10

11

2

Diretório

1* 5* 21*

2

10*

2

15* 7* 19*

2

Inserindo 20*

13*

4* 12* 20*

3

32* 16*

3

000

001

010

011

100

101

110

111

3

GlobalLocal

Bucket A1

Bucket A2

Bucket D

Bucket C

Bucket C

Análise Se o diretório couber na memória

Seleção com igualdade : 1 I/0

Se o diretório tiver que ser armazenado em disco Seleção com igualdade : 2 I/0

Hash Linear Assim como o Hash Extensível, o Hash

Linear é ideal para inserções e supressões; Vantagem sobre extensível

Lida muito bem com colisões Oferece muita flexibilidade

Cadeias de overflow podem tornar o hash linear inferior em performance ao hash extensivel

Parâmetros e Contadores Nivel = indica a rodada atual

Inicializado com 0 Next = bucket que deve ser dividido, se necessário

Inicializado com 0 Nm = número de buckets na rodada m

N0 = N Nm = N*2m

Somente o bucket com número Next é dividido. Usa-se páginas de overflow para os outros buckets, se

ficarem cheios. Após divisão, Next é incrementado.

Esquema Geral : rodada k

Bucket Nexta ser dividido

Imagens dos buckets divididos

Bucket b

Bucket b + m

Buckets existentesno inicio da rodada k

m = número de buckets da rodada k

32* 44* 36*

9* 25* 5*

14*

31* 35* 7*

18* 10* 30*

11*

Páginas Primárias

Nivel = 0 , N = 4 = 22

Next = 0h0h1

00

01

10

11

000

001

010

011

Esta informação não é armazenada !

Inserção de 43*

h0(43) = 3 (11)

43*

Next = 1

44* 36*00

32*

9* 25* 5*

14*

31* 35* 7*

18* 10* 30*

11*

Nivel = 0 , N = 4 = 22h0h1

00

01

10

11

000

001

010

011

Busca de 18*

h0(18) = 2 (10)

43*

Next = 1

44* 36*00

2 > Next

Bucket 2 não foi dividido ainda

100

32*

9* 25* 5*

14*

31* 35* 7*

18* 10* 30*

11*

Nivel = 0 , N = 4 = 22h0h1

00

01

10

11

000

001

010

011

Busca de 32* e 44*h0(32) = 00

43*

Next = 1

44* 36*00

0 < Next

Bucket 0 já foi dividido ainda

h0(44) = 00

h1(32) = 000

h1(44) = 100Bucket 0 + 4

100

Inserção de 37*

32*

9* 25* 5*

14*

31* 35* 7*

18* 10* 30*

11*

00

01

10

11

000

001

010

011 43*

Next = 1

44* 36*00100

h0(37) = 01

37*

Inserção de 29*32*

9* 25* 5*

14*

31* 35* 7*

18* 10* 30*

11*

00

01

10

11

000

001

010

011 43*

Next =1

44* 36*00100

h0(29) = 01

37*

5* 37* 29*01101

Next =2

Incremento de Nível32*

9* 25*

66*

31* 35* 7*

18* 10* 34*

11*

00

01

10

11

000

001

010

011 43*

44* 36*00100

h0(50) = 10

5* 37* 29*01101

14* 30* 22*10110

h1(50) = 010

50*Next =3

Next =0Nivel = 1

31*111 11 7*

43* 11*