módulov: indexação em banco de dados (aulas 1, 2 e 3)clodis/bdi/bdi_2007_modulo5_1.pdf ·...

Post on 08-Nov-2018

216 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Módulo V: Indexação em Banco de Dados

(Aulas 1, 2 e 3)

Clodis Boscarioli

Banco de Dados I

2007

Agenda:

� Estruturas de Índices;� Conceitos;� Tipos de Índices:

� Primários;� Secundários;� Clustering;� Multiníveis;� Árvore B e B+;� Hash;

� Exemplos.

Índice - Conceitos

� Estrutura de dados que recebe como entradauma propriedade de registro (por exemplo, um valor de um ou mais campos) e encontra os registros com essa propriedade rapidamente;

� Um índice permite localizar um registro semter que examinar mais que uma pequenafração dos registros possíveis;

� O(s) campo(s) cujos valores o índice se baseia formam a chave de pesquisa;

Índices são, portanto, estruturas de dados auxiliares cujo único propósito é tornar mais rápido o acesso a registros baseado em certos campos, chamados campos de indexação.

Blocos contendo registros

índice(valor)

Registros coincidentes

� Índice primário - baseado na chave de ordenação;

� Índice de agrupamento (clustering) - baseado no campo de ordenação não-chave de um arquivo;

� Índice secundário - baseado em qualquer campo não ordenado de um arquivo;

� Índices multiníveis;

� Árvores B e B+;

� Tabelas Hash;

Estruturas de índices

Índices sobre Arquivos Seqüenciais

� Tipos de índices

10

20

30

40

50

60

Densos: uma entrada no arquivo de índices p/cada registro no arquivo de dados

Esparsos: apenas alguns registros de dados são representados no arquivo de índices

10

20

30

40

50

60

10

30

50

70

90

110

10

20

30

40

50

60130

150 70

80

Um índice denso sobre um arquivo de dados seqüenciais

Um índice esparso sobre um arquivo de dados seqüenciais

70

8070

80

Tipos de índices

� Índice Denso

� Seqüência de blocos contendo apenas as chaves dos registros e os ponteiros para os próprios registros

� Índice denso = (chave-ponteiro, registro)

� Índice Esparso

� Usa menos espaço de armazenamento que o índice denso ao custo de um tempo um pouco maior para localizar um registro dada a sua chave

� Índice esparso = (chave-ponteiro, blocos de dados)

Aponta para o 1o. registro do bloco

Índices Primários

� Modelo simples;

� Arquivo classificado (com dados) + arquivo de índices;

� Par (chave de pesquisa, ponteiro);

� Tuplas são classificadas pela chave primária;

� Útil quando a chave de pesquisa é a chave primária;

10

20

30

40

50

60 Arquivo seqüencial

Índice primário para o campo-chave de classificação do arquivo.

Exemplo:

Índice clustering para o campo NUM_DEPARTAMENTO, que não é campo-chave de classificação, de um arquivo EMPREGADO.

Exemplo:

Índice clustering com um grupo (cluster) separado de blocos para cada grupo de registros que compartilhem o mesmo valor de campo clustering.

Exemplo:

Fatores de eficiência do uso de índices

� O número de blocos de índices em geral é pequeno quando comparado com o número de blocos de dados;

� Tendo em vista que as chaves são classificadas, a pesquisa é rápida (pode-se usar um algoritmo de pesquisa binária);

� O índice pode ser pequeno o bastante para ser mantido permanentemente em buffers da memória principal. Nesse caso, uma pesquisa para uma determinada chave envolve apenas acessos à memória principal, sem precisar de operação de I/O.

Índices Secundários

O campo de indexação é um campo não ordenado do arquivo de dados. Podem haver muitos índices secundários para um mesmo arquivo.

Dois casos:

� O campo de indexação é um campo chave (às vezes chamado de chave secundária).

� O campo de indexação não é chave.

Índices Secundários

� É possível que mais de um registro tenha o valor da chave. Isso ocorre, por exemplo, quando a chave de pesquisa não é a chave primária;

� Solução: usar chave associada a um ponteiro para o primeiro dos registros com a chave K

� Vantagem: otimizar as consultas

10

20

30

40

10

10

10

20

30

30

40

40

Índice denso quando são permitidas chaves de pesquisa duplicadas

Mais de

um reg

istro com o

valor de

uma de

term

inad

a ch

ave

Outro Esquema para Índices Secundários

� A entrada de índice para um bloco de dados é a menor chave de pesquisa que é nova, isto é, a chave não apareceu em um bloco anterior;

� Se não há chave de pesquisa nova no bloco, então sua entrada de índice contém a única chave de pesquisa encontrada nesse bloco;

� Pode-se encontrar os registros de uma chave de pesquisa K examinando-se o índice p/a primeira entrada cuja chave é:� Igual a K� Menor que K, mas a próxima

chave é maior que K� Segue-se o ponteiro da entrada. Se for

encontrado pelo menos um registro com a chave de pesquisa K, então a busca continua em blocos adicionais, até encontrar todos os registros com a chave de pesquisa K.

10

20

30

30

40

50

10

10

10

20

20

3060

7030

30

Índice esparso indicando a nova chave de pesquisa mais baixa em cada bloco

40

50

Índice secundário denso (com ponteiros de bloco) em um campo não é chave de classificação de um arquivo.

Exemplo:

Índices Secundários sobre Campos Não Chave

Vários registros do arquivo de dados podem ter o mesmo valor para o campo de indexação.

� Opção 1: Várias entradas no índice com o mesmo valor, uma para cada registro. Índice denso.

� Opção 2: Uma entrada no índice para cada valor X do campo de indexação, com lista de ponteiros. Índice não denso.

� Opção 3: Uma entrada no índice para cada valor X do campo de indexação, com um ponteiro para o bloco que contém a lista de ponteiros para os registros com o valor X. Índice não denso.

Sumário:

Tipos de Índices

Campo de Ordenação Campo Não Ordenado

Campo chave Índice Primário Índice Secundário

(Chave)

Campo Não Índice de Índice SecundárioChave Agrupamento (Não chave)

Tipo de Índice Número de Entradas Denso ou Esparso

Primário Número de blocos no Esparsoarquivo de dados

Agrupamento Número de valores Esparsodistintos do campo de indexação

Secundário Número de registros Denso(chave) no arquivo de dados

Secundário Número de registros Densono arquivo de dados

(não chave) ouNúmero de valores Esparsodistintos do campo de indexação

Propriedades dos Índices

Índice secundário (com ponteiros de registro), em um campo que não é campo-chave, implementado em um nível adicional, indireto, de forma que as entradas de índice sejam de tamanho fixo e possuam valores de campo únicos.

Exemplo:

Índices de Múltiplos Níveis

� Motivação: se o arquivode índices se torna muito grande para ser armazenado embloco de disco, é interessante indexá-lo em mais de um nível

� Vantagem: índice pequeno pode ser mantido em memória e o tempo de busca é mais baixo

� Desvantagem: muitosníveis de índices podem aumentar a complexidade do sistema (talvez seja melhor usar a árvore-B)

10

90

170

250

330

410

10

30

50

70

90

110

490

570

130

150

170

110

130

150

10

20

30

40

50

60

70

80

90

100

Esparso ou denso Esparso

� Um índice multinível é um “Índice de índice”.

� Primeiro nível: arquivo ordenado pela chave de indexação, valores distintos, entradas de tamanho fixo.

� Demais níveis: índice primário sobre o índice do nível anterior e assim sucessivamente até que no último nível o índice ocupe apenas um bloco.

� Número de acessos a bloco: um a cada nível de índice, mais um ao bloco do arquivo de dados.

Índices de Múltiplos Níveis

Índice primário de dois níveis que se parece com a organização ISAM (IndexedSequential Acess Method – Método de Acesso Seqüencial Indexado).

Exemplo:

Índices de Múltiplos Níveis

Problema dos índices multiníveis: índices são arquivos fisicamente ordenados, portanto, ineficientes na inserção e remoção.

Solução:

� Deixar algum espaço em cada um dos blocos para inserção de novas entradas.

� Estruturas de dados: Árvores B e suas variações.

Gerenciamento de índices na Modificações de Dados

� Problema com arquivos seqüenciais: com o tempo, um bloco não é mais suficiente para armazenar o conteúdo que era antes armazenado.

� Como controlar o problema?� Criar blocos de estouro (overflow). Blocos de estouro

não tem entradas em um índice esparso;� Inserir novos blocos na ordem seqüencial;� Se não houver lugar para inserir informação em um

bloco, alguma informação poderá ser transferida para outro bloco. Da mesma forma, blocos vazios poderão ser combinados.

Pode ser necessário modificar os índices

Árvores como Estruturas de ÍndicesA

B C D

FE G H I

J K

nó raiz (nível 0)

nível 1

nível 2

nível 3

Árvore de grau 3

Sub-árvore de grau 2

P1 K1 ... Ki-1 Pi Ki ... Kq-1 Pq

X X X

Ki-1 < X < Ki Kq-1 < XX < K1

Um nó de umaárvore de pesquisa

5

3

1

6 9

7 8 12Uma árvore de

busca de ordem p = 3

Árvores de Busca

Árvores B

� Árvore de busca projetada com dois objetivos:� Manter a árvore balanceada e � Evitar o desperdício de espaço dentro de um nó, à custa de maior complexidade nos algoritmos de inserção e remoção.

� Introduzida por: R. Bayer e E. McCreight: “Organization and Maintenance of Large OrderedIndexes”, Acta Informatica, 1(3), Feb 1972.

� Revista por: D. Comer: “The Ubiquitous B-tree”, ACM Computing Surveys, 11(2), 1979.

Nó de uma árvore B

P1 K1 Pr1 P2 ... Ki-1 Pri-1 Pi Ki Pri ... Kq-1 Prq-1 Pq

X X X

Ki-1 < X < Ki Kq-1 < XX < K1

dados dados

p/2 < q < p

Árvore B – Um Exemplo:

5

3 8

1 4 6 7 9 12

Capacidade das Árvores BObjetivo: Cada nó da árvore corresponde a um bloco de disco, por exemplo:

Tamanho da chave de pesquisa V = 9 bytesTamanho do ponteiro de blocos P = 6 bytesTamanho do bloco de disco B = 512 bytesCada nó pode ter no máximo:

p-1 ponteiros de dadosp-1 valores de chave de pesquisap ponteiros de árvore

(p-1) x 6 + (p-1) x 9 + p x 6 ≤ 51221 x p ≤ 527p = 25

Capacidade máxima em número de chaves:24 + 25 x 24 + 25 x 25 x 24 + 25 x 25 x 25 x 24 + ...

(extremamente improvável sob inserções e remoções aleatórias)

O número mínimo de chaves em um nó é p/2. Navathe et. Al (2005) afirmam que, por análise e simulação, após várias inserções e remoções em uma árvore B, os nós se estabilizam com aproximadamente 69% da capacidade. Nesta situação, separação e combinação de nós ocorrem muito raramente.

p x 0,69 = 27 x 0,69 = 17

capacidade média: 16 + 17 x 16 + 17 x 17 x 16 + 17 x 17 x 17 x 16 + ...

16 288 4.912 83.520

Árvores B+

Os nós de uma árvore-B+. (a) Nó interno de uma árvore-B+ com q - 1 valores de busca. (b) Nó folha de uma árvore-B+ com q - 1 valores de busca e q - 1 ponteiros de dados.

Capacidade de Árvores B+

Mesmo exemplo anterior:Tamanho da chave de pesquisa V = 9 bytesTamanho do ponteiro de blocos P = 6 bytesTamanho do bloco de disco B = 512 bytesCada nó pode ter no máximo:

p-1 valores de chave de pesquisap ponteiros de árvore

(p-1) x 9 + p x 6 ≤ 51215 x p ≤ 521p = 34 (maior do que na árvore B correspondente)

Capacidade média da árvore:

p x 0,69 = 34 x 0,69 = 23

22 + 23 x 22 + 23 x 23 x 22 + 23 x 23 x 23 x 22 + ...

22 528 12.166 279.840

ou seja, sua capacidade é bem maior que a de uma árvore B correspondente.

5

3 7 8

8 1 3 4 5 9 12 6 7

Árvore B+ – Um Exemplo:

Ver slides inserção e remoçãoVer slides inserção e remoção

Um exemplo de inclusão em uma árvore-B+ de ordem p = 3 e pfolha = 2.

Exemplo:

Um exemplo de remoção em uma árvore-B+.

Exemplo:

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

Índice Estruturado por Hash

Hash Estático - Busca

0

1

2

5

h

h(14) mod 6 = 2

14

Dados ordenados pela chave

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

N = 6

4

3

….<14,* >

Hash Estático - Inserção

0

1

2

5

h

h(7) mod 6 = 1

7

Dados ordenados pela chave

Inserindo < 7, * >

4

3

< 7, * >

Cheia

Hash Estático - Remoção

0

1

2

5

h

h(25) mod 6 = 1

25

…Removendo < 25, * >

4

3

< 25, * >

Dados ordenados pela chave

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

Hash - 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 Remoção requerem 2 I/O

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

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 o desempenho da busca.

Hash - 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

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.

� 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.

Convenção de Notação

Bucket contendo entradas do arquivo de índice

25* 10* 25* 8* 8*

Representa a entrada <k,*>, onde h(k) = 25

h = função hash fixa

Diretório de Buckets

Diretorio: só armazena ponteiros para os buckets;número de registros = número de buckets;

Bucket 1

Contém todas as entradas <k,*> tais que h(k) mod N = 1

1

2

3

N

Bucket 2

Bucket 3

Hash - O que pode variar

� Função hash não varia.

� O número N de buckets varia.

� A medida que os buckets se enchem, estes se duplicam, e o diretório de buckets duplica.

� Resultado:

� se um único bucket duplica, o diretório todo de buckets duplica;

� Dois 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.

Exemplo:

00

01

10

11

2

Diretório

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 de dados

Profundidade Local

N = 4 = 22

Últimos2 dígitos darepresentação binária de h(k)

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 de dados (buckets)

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

N = 8 = 23

Últimos3 dígitos darepresentação binária de h(k)

Exemplo – Inserção

110

2

Diretorio

4* 12* 32* 16*

2

1* 5*

2

10*

2

15* 7* 19*

2

Inserindo 9*

4* 12* 20*

3

32* 16*

3

2

Diretório

000

001

010

011

100

101

100

111

3

Global

21* 13*

Exemplo – Inserção

110

2

Diretorio

4* 12* 32* 16*

2

1* 9*

3

10*

2

15* 7* 19*

2

Inserindo 9*

4* 12* 20*

3

32* 16*

3

2

Diretorio

000

001

010

011

100

101

100

111

3

Global

5* 21* 13*

3

Regra Geral para Inserção de k*

Se Nível global = d� Calcula h(k);� Considera a entrada m do diretório, onde

m = número correspondente aos d últimos dígitos da representação binária de h(k);

� Dirige-se para o bucket indicado;� Se o bucket estiver cheio e nível local = d

� Divide o bucket e duplica o diretório de buckets;� Se o bucket estiver cheio e nível local = d-1

� Divide o bucket, mas não duplica diretório.

Hash - Possíveis Problemas

� Distribuição tendenciosa dos valores h(k): muitos em um único bucket. � Este é um problema que pode ser resolvido no momento da

criação do índice: basta ajustar a função h de modo a ter uma distribuição uniforme.

� Colisão: quando existem muitas entradas <k,*> com mesmo h(k), que não cabem em uma página� Este é um problema que só aparece à medida que o arquivo

cresce.� Neste caso, páginas de overflow são utilizadas.

Hash - 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.� Técnica de indexação Hash é muito útil na implementação do operador

Junção, que inclui diversas seleções por igualdade. Muitos SGBDs só implementam índices estruturados por B-Trees.

� Diferença de custo entre B-Tree e Hash é significativa neste caso.

Referências Bibliográficas

� Sistemas de Banco de Dados. (Cap. 11) Abraham Silberchatz, Henry F. Korth e S. Sudarshan. 3ª Edição. Makron Books, 1999.

� Sistemas de Banco de Dados. (Cap. 14) Ramez Elsmari, 4ª Edição. Shamkant B. Navathe. Pearson Addison Wesley, 2005.

� Database Management Systems. (Cap. 8-10) R. Ramakrishnan e J. Gehrke. McGraw-Hill, 2ª Edição, 2000.

top related