Upload
internet
View
121
Download
8
Embed Size (px)
Citation preview
INF70 – Gerenciamento de Banco de Dados 2Índices baseados em Hash
Ilmério Reis da [email protected]/~ilmerio/gbd2UFU/FACOM/BCC
UFU/FACOM/BCC
Roteiro
• Fundamentos
• Hash Estático
• Hash Extensível
• Hash Linear
• Considerações Finais
UFU/FACOM/BCC GBD2 Página:3
Fundamentos
Fundamentos
UFU/FACOM/BCC GBD2 Página:4
Características
• melhor desempenho em busca por igualdade na chave, mas
não melhora busca por intervalo (>, <)• alguns SGBDs só implementam Árvore B+• o PostgreSql implementa também Tabelas Hash• hash apresenta ganho significativo em junções EquiJoin• função hash. hash : set of keys → set of bucket ids• Hash ideal: distribuição uniforme das entradas nos buckets• conteúdo dos buckets: alternativas (1), (2) ou (3)
UFU/FACOM/BCC GBD2 Página:5
Função Hash
Exemplo:
hash(k) = h(k) mod B,
ondeh : set of keys → integerB : é o número de buckets disponíveisSE k é inteiro, use
– h(k) = k ou – h(k) = a k + b, sendo a e b empíricos.
UFU/FACOM/BCC GBD2 Página:6
Classificação • Hash Estático: conjunto de buckets fixo
problemas com cadeias de overflow.• Hash Dinâmico: cria buckets de forma dinâmica para evitar
ou reduzir cadeias de overflow Hash Extensível: usa mais um nível de indireção
diretório indexado por uma sequência de bits;havendo split, a sequência de bits cresce
Hash Linear: ameniza impacto do crescimento, ’tolerando’ poucos overflows;
novos buckets são criados linearmente• compromisso(trade-off) de Hash Estático x Hash Dinâmico
é análogo ao compromisso ISAM x B-Tree
UFU/FACOM/BCC GBD2 Página:7
Hash Estático
Hash Estático
UFU/FACOM/BCC GBD2 Página:8
Alocação de área para buckets
Alocação de N páginas sucessivas no disco
Cada bucket terá entradas de dados <chave*> (Alt. 1, 2 ou 3)
0
1
2
N-1
Páginas Primárias dos Buckets
UFU/FACOM/BCC GBD2 Página:9
Alocação dinâmica de páginas de overflow
Páginas de overflow são alocadas de forma dinâmica
0
1
2
N-1
Páginas Primárias dos Buckets
…
…
…
Páginas de Overflow
UFU/FACOM/BCC GBD2 Página:10
Alocação dinâmica de páginas de overflow
Seja k a chave do hash, então a localização do bucket será por meio da função hash
Entradas do tipo <k* >
0
1
2
N-1
hash
hash(k)=h(k) mod N
k
Páginas Primárias dos Buckets
…
…
…
Páginas de Overflow
UFU/FACOM/BCC
Busca
0
1
2
5
hash
h(14) mod 6 = 2
14
…
…
…
Páginas Primárias dos Buckets
< 14* > h(x) = x
N = 6
4
3
….<14*>
UFU/FACOM/BCC
Inserção
0
1
2
5
hash
h(7) mod 6 = 1
7
…
…
Páginas Primárias dos Buckets
Inserindo < 7* >
4
3
< 7* >
Cheia
UFU/FACOM/BCC
Remoção
0
1
2
5
hash
h(25) mod 6 = 1
25
…
…Suprimindo < 25* >
4
3
< 25* >
Páginas Primárias dos Buckets
UFU/FACOM/BCC GBD2 Página:14
Considerações finais sobre Hash Estático
• usualmente bucket = h(k) mod B, onde B = 2L
• custo depende do tamanho das cadeias de overflow• páginas primárias geralmente são contíguas no disco• bucket não é removido, mesmo ficando sem entradas• cadeia de overflow é dinâmica e degrada desempenho• uma estratégia é deixar 20% de área livre nas páginas
primárias
UFU/FACOM/BCC GBD2 Página:15
Hash Extensível
Hash Extensível
UFU/FACOM/BCC GBD2 Página:16
Evitando cadeias de overflowSolução ingênua
Seja B o número de páginas primárias
Solução ingênua:
SE inserção em página primária cheia faça B=2 * B reorganize todos os buckets
Problema: a reorganização de todos os buckets é computacionalmente cara, tornando esta solução inviável.
UFU/FACOM/BCC GBD2 Página:17
Evitando cadeias de overflowHash Extensível
• Um diretório de ponteiros para buckets• SE inserção em página primária cheia crie um novo bucket dobre o tamanho do diretório reorganize a função hash
Problema: a reorganização da função hash é um pouco complexa, mas considerando que o diretório cabe na memória, é computacionalmente viável.
UFU/FACOM/BCC
Diretorio de ponteiros para buckets
Diretório : so armazena ponteiros para os buckets
Bucket 1
Contém todas as entradas <k*> tais que h(k) mod N = 1
1
2
...
N-1
Bucket 2
0
Bucket N-1
Bucket 0
UFU/FACOM/BCC GBD2 Página:19
Funcionamento
• Função hash não varia• O número N de entradas no diretório varia• A medida que os buckets se enchem, estes se duplicam, e o
diretório de buckets também pode duplicar. Atenção somente um bucket por vez é duplicado
• Resultado: se um único bucket duplica, o diretório todo pode duplicar vários ponteiros do diretório podem apontar para o mesmo bucket só duplicam os buckets que ficam cheios. ao contrário do hash estático, registros em buckets duplicados
(decorrentes de um overflow) podem ser facilmente localizados através do novo ponteiro no diretório de buckets.
UFU/FACOM/BCC
Exemplo
00
01
10
11
2
Diretorio
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
Paginas de dados
Profundidade Local
N = 4 = 22
Ultimos2 digitos darepresentação binaria de h(k)
UFU/FACOM/BCC
Inserção simples
00
01
10
11
2
Diretorio
4* 12* 32* 16*
2
1* 5* 21*
2
10*
2
15* 7* 19*
2
Paginas de dados (buckets)
Inserindo 13*
13*
UFU/FACOM/BCC
00
01
10
11
2
Diretorio
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
Inserção em bucket cheioSplit do bucket
UFU/FACOM/BCC
Diretorio
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
111
3
GlobalLocal
Bucket A1
Bucket A2
Bucket D
Bucket C
Bucket C
N = 8 = 23
Ultimos3 digitos darepresentação binaria de h(k)
110
Inserção em bucket cheioDuplica diretório e reorganiza da função hash
UFU/FACOM/BCC GBD2 Página:24
Regra de inserção com split - Hash Extensível
Sejam: pl a profundidade local e
pg a profundidade global;
Incrementar pl;
Criar novo bucket e Redistribuir entradas de acordo com pl-ésimo bit mais significativo de hash(k);
SE (pl > pg), duplicar diretório: Incrementar pg; Criar novas entradas no diretório (i.e. duplicar); Apontar novas entradas p/ buckets originais(pl-1 bits);
Atualizar ponteiro que apontará para o novo bucket, de acordo com os pl bits mais significativos de hash(k).
UFU/FACOM/BCC GBD2 Página:25
Considerações Finais – Hash Extensível
• diretório geralmente cabe na memória• Exemplo:
100MB em páginas de 4K → 25000 entradas no diretório• remoção usa processo inverso, podendo reduzir tamanho do
diretório• problema:
distribuição não uniforme de chaves geram muitos splits localizados e, consequentemente, diretório pode ter crescimento exagerado.
UFU/FACOM/BCC
Hash Linear
Hash Linear
UFU/FACOM/BCC
Hash Linear
• Não ha diretório de buckets
• Pode haver páginas de overflow à medida que os buckets se enchem
• Regularmente páginas de overflow são transformadas em novos buckets
• Regularmente a função hash se modifica, dobrando a capacidade de endereçamento de buckets
UFU/FACOM/BCC
Parâmetros e Contadores
• Nivel = indica a rodada atual, a função de hash 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. Apos divisão, Next é incrementado
UFU/FACOM/BCC
Esquema Geral : rodada m
Bucket Nexta ser dividido
Imagens dos buckets divididos
next buckets divididos na rodada
Bucket Nm + next
Buckets existentesno início da rodada m
Nm = número de buckets
no início da rodada m
UFU/FACOM/BCC
32* 44* 36*
9* 25* 5*
14*
31* 35* 7*
18* 10* 30*
11*
Nivel = 0 , N = 4 = 22
Next = 0h0h1
00
01
10
11
000
001
010
011
Esta informação não é armazenada !
h0(43) = 3 (11)
43*
Next = 1
44* 36*00
Inserção de 43*
Inserção provocando split e avanço do next
Paginas Primarias Paginas de Overflow
UFU/FACOM/BCC
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 = 1
Bucket 2 não foi dividido ainda
100
Busca em bucket após o next
UFU/FACOM/BCC
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 ja foi dividido !
h0(44) = 00
h1(32) = 000
h1(44) = 100Bucket 0 + 4
100
Busca em bucket antes o next
UFU/FACOM/BCC
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 sem split
UFU/FACOM/BCC
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
Inserção com split e incremento no next
UFU/FACOM/BCC
Inserção do 50*
32*
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
111 11 31* 7*
43* 35* 11*
Inserção com split e mudança de rodada
UFU/FACOM/BCC
ComparandoDuplicar diretório x duplicar buckets
• Passagem de hi para hi+1 no Hash Linear corresponde a duplicar o diretorio no Hash Extensível
• Hash Extensível : diretório é duplicado num único passo
• Hash Linear : duplicação do número de buckets se faz gradualmente
UFU/FACOM/BCC
Comparando utilização de espaço nos buckets
• Hash Extensível tem uma melhor ocupação dos buckets pois só se divide o bucket apropriado
• Hash Linear não precisa de diretório: existe uma maneira precisa de se saber quais buckets
foram divididos e quais devem ser divididos e em que circuntâncias
Buckets são alocados consecutivamente: é possível localizar a página do bucket m por um simples cálculo de offsets.
UFU/FACOM/BCC
Comparando Custo IO Extensível x Linear
Em busca por igualdade
Hash Linear tem um custo I/O menor em caso de distribuição uniforme
Hash Extensível tem um custo menor em caso de distribuição não uniforme
UFU/FACOM/BCC
Considerações finais sobre Hash
• índices baseados em hash são os melhores para busca com predicado de igualdade
• íındices baseados em hash não suportam busca por intervalo• Hash estático pode resultar em longas cadeias de overflow• Hash extensível usa diretórios para controlar crescimento do
hash, evitando overflow• Hash linear usa variação de função para diminuir cadeias de
overflow, gerando buckets linearmente• Em geral distribuição não uniforme prejudica desempenho de
índices baseados em Hash
UFU/FACOM/BCC GBD2 Página:40
Exercícios - Índices baseados em hash
EXERCÍCIOS CAP 11 LIVRO-TEXTO
UFU/FACOM/BCC GBD2 Página:41
FIM - Índices baseados em hash
FIM - Índices baseados em hash*
* material baseado no livro-texto e slides da Profa. Sandra de Amo