Você está na página 1de 57

Banco de Dados I

2007

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

(Aulas 1, 2 e 3)

Clodis Boscarioli
Agenda:
 Estruturas de Índices;
 Conceitos;
 Tipos de Índices:
 Primários;
 Secundários;
 Clustering;
 Multiníveis;
 Árvore B e B+;
 Hash;
 Exemplos.
Índice - Conceitos
índice(valor)
 Estrutura de dados que recebe como entrada
uma 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 sem
ter que examinar mais que uma pequena
fração dos registros possíveis;
 O(s) campo(s) cujos valores o índice se Blocos contendo
baseia formam a chave de pesquisa; registros

Índices são, portanto, estruturas de dados Registros


auxiliares cujo único propósito é tornar mais coincidentes
rápido o acesso a registros baseado em certos
campos, chamados campos de indexação.
Estruturas de índices
 Í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;
Índices sobre Arquivos Seqüenciais
 Tipos de índices
Esparsos: apenas alguns registros de dados
são representados no arquivo de índices
Densos: uma entrada no arquivo de índices
10
p/cada registro no arquivo de dados 10
30
10 10 20
50
20 20
70 30
30
30 40
40
40
90 50
50 50 110 60
60 60 130
70 70
70 150
80
80 80
Um índice denso sobre um arquivo Um índice esparso sobre um
de dados seqüenciais arquivo de dados seqüenciais
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

Arquivo seqüencial
20

30
40

50
60
Exemplo:

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

valor de uma determinada chave


10

Mais de um registro com o


 É possível que mais de um registro 10
tenha o valor da chave. Isso 20
10
ocorre, por exemplo, quando a 30
chave de pesquisa não é a
chave primária; 40 10
 Solução: usar chave associada a 20
um ponteiro para o primeiro dos
registros com a chave K
30
 Vantagem: otimizar as consultas
30

40
40

Índice denso quando são permitidas


chaves de pesquisa duplicadas
Outro Esquema para Índices Secundários
10
 A entrada de índice para um bloco de 10
dados é a menor chave de pesquisa 20
que é nova, isto é, a chave não 10
apareceu em um bloco anterior; 30
 Se não há chave de pesquisa nova no 30 10
bloco, então sua entrada de índice
contém a única chave de pesquisa 20
encontrada nesse bloco; 40
 Pode-se encontrar os registros de uma 20
chave de pesquisa K examinando-se o 50
índice p/a primeira entrada cuja chave 60 30
é:
 Igual a K 70
30
 Menor que K, mas a próxima
chave é maior que K 30
 Segue-se o ponteiro da entrada. Se for
encontrado pelo menos um registro 40
com a chave de pesquisa K, então a
busca continua em blocos adicionais, 50
até encontrar todos os registros com a
chave de pesquisa K. Índice esparso indicando a nova chave
de pesquisa mais baixa em cada bloco
Exemplo:

Índice secundário denso


(com ponteiros de bloco)
em um campo não é chave
de classificação de um
arquivo.
Í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ário


Chave Agrupamento (Não chave)
Propriedades dos Índices Tipo de Índice Número de Entradas Denso ou Esparso

Primário Número de blocos no Esparso


arquivo de dados

Agrupamento Número de valores Esparso


distintos do campo de
indexação

Secundário Número de registros Denso


(chave) no arquivo de dados

Secundário Número de registros Denso


no arquivo de dados
(não chave) ou
Número de valores Esparso
distintos do campo de
indexação
Exemplo:

Í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.
Índices de Múltiplos Níveis
10 10
10
30 20
90
 Motivação: se o arquivo 50
de índices se torna 170 30
muito grande para 70
ser armazenado em 250 40
bloco de disco, é interessante 90
indexá-lo em mais de um nível
110 50
 Vantagem: índice pequeno pode
ser mantido em memória e o 60
tempo de busca é mais baixo 130
 Desvantagem: muitos 150
níveis de índices 70
podem aumentar a 330
complexidade do 170 80
sistema (talvez seja 410
melhor usar a árvore-B) 110
490
130 90
570 100
150

Esparso ou denso Esparso


Índices de Múltiplos Níveis

 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.
Exemplo:

Índice primário de dois níveis que se


parece com a organização ISAM (Indexed
Sequential Acess Method – Método de
Acesso Seqüencial Indexado).
Í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 Índices
A nó raiz (nível 0)

B C D nível 1

E F G H I nível 2

J K nível 3

Sub-árvore de grau 2
Árvore de grau 3
P1 K1 ... Ki-1 Pi Ki ... Kq-1 Pq

Um nó de uma
árvore de pesquisa
X X X

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

Árvores de Busca
5

3 6 9

1 7 8 12
Uma árvore de
busca de ordem p = 3
Á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 Ordered
Indexes”, 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

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

dados dados

p/2 < q < p


Árvore B – Um Exemplo:

3 8

1 4 6 7 9 12
Capacidade das Árvores B
Objetivo: Cada nó da árvore corresponde a um bloco de disco, por exemplo:
Tamanho da chave de pesquisa V = 9 bytes
Tamanho do ponteiro de blocos P = 6 bytes
Tamanho do bloco de disco B = 512 bytes
Cada nó pode ter no máximo:
p-1 ponteiros de dados
p-1 valores de chave de pesquisa
p ponteiros de árvore
(p-1) x 6 + (p-1) x 9 + p x 6 ≤ 512
21 x p ≤ 527
p = 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 bytes
Tamanho do ponteiro de blocos P = 6 bytes
Tamanho do bloco de disco B = 512 bytes
Cada nó pode ter no máximo:
p-1 valores de chave de pesquisa
p ponteiros de árvore
(p-1) x 9 + p x 6 ≤ 512
15 x p ≤ 521
p = 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.


Árvore B+ – Um Exemplo:

3 7 8

1 3 4 5 6 7 8 9 12

Ver slides inserção e remoção


Exemplo:

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+.
Índice Estruturado por Hash
Hash Estático
0 …
h(chave) mod N
1 …

chave 2
h

h = função hash …
N-1

Páginas Primárias dos Buckets Páginas de Overflow


Entradas do tipo <chave, * >
Hash Estático - Busca

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

0 … N=6
h(14) mod 6 = 2
1 …
….
14 2 >
<14,*
h
3

4
5 …

Dados ordenados pela chave


Hash Estático - Inserção

Inserindo < 7, * >


0 …
h(7) mod 6 = 1
1 < 7, * >

7 2 Cheia
h
3

4
5 …

Dados ordenados pela chave


Hash Estático - Remoção

Removendo < 25, * >


0 …
h(25) mod 6 = 1
1 < 25, * >

25 2
h
3

4
5 …

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

25* 10* 25* 8* 8*

Bucket contendo entradas do


arquivo de índice

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

h = função hash fixa


Diretório de Buckets

Bucket 1
1

2 Bucket 2

3 Contém todas as entradas <k,*>


tais que h(k) mod N = 1
N
Bucket 3

Diretorio: só armazena ponteiros para os buckets;


número de registros = número de buckets;
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:
Profundidade Global Profundidade Local
2
4* 12* 32* 16* Bucket A N = 4 = 22
2

00 2
Últimos
1* 5* 21* Bucket B
2 dígitos da
01 representação
2 binária de h(k)
10* Bucket C
10
2
11 15* 7* 19* Bucket D

Diretório Páginas de dados


Exemplo – Inserção

2 Inserindo 13*
4* 12* 32* 16*
2

00 2
1* 5* 21* 13*

01
2
10*
10
2
11 15* 7* 19*

Diretório Páginas de dados (buckets)


Exemplo – Inserção

2 Inserindo 20*
4* 12* 32* 16*
2

00 2
1* 5* 21* 13*

01
2
10*
10
2
11 15* 7* 19*

2
Diretório
4* 12* 20*
Exemplo – Inserção
Local Inserindo 20*
Global 3
32* 16* Bucket A1
2
3
N = 8 = 23
000 2
00
001 1* 5* 21* 13* Bucket C
010 Últimos
01
011 2 3 dígitos da
representação
100 10* Bucket C binária de h(k)
10
101 2
110
11 15* 7* 19* Bucket D
111
3
Diretório
4* 12* 20* Bucket A2
Exemplo – Inserção
2
3
Global 4* 12* 32* 16*
Inserindo 9*
2
2
3
1* 5* 21* 13*
000
001 2
10*
010
011 2
100 15* 7* 19*
101 3
110 4* 12* 20*
111
100
Diretorio
Diretório
Exemplo – Inserção
2
3
Global 4* 12* 32* 16*
Inserindo 9*
3
2
3
1* 9*
000
001 2
10*
010
011 2
100 15* 7* 19*
101 3
110 4* 12* 20*
111
100 3
Diretorio 5* 21* 13*
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.

Você também pode gostar