Sei sulla pagina 1di 26

Captulo 6

Indexao

Programa
Introduo Operaes bsicas sobre arquivos Armazenagem secundria Conceitos bsicos sobre estrutura de arquivo Organizando arquivos para desempenho Indexao Processamento co-seqencial e ordenao B-Tree e outras organizaes em rvores B+Tree e acesso seqencial indexado Hashing Hashing estendido
2

Objetivos
Introduzir os conceitos bsicos de indexao. Apresentar a utilizao de ndices simples para promover rpido acesso a registros. Investigar as aplicaes do uso de indexao para manuteno de arquivos. Investigar o acesso a registros usando mais de um ndice.

Viso Geral do Captulo


1. 2. 3. 4. 5. 6. 7. 8.

O que um ndice? ndices simples com insero temporal. Operaes bsicas de indexao. ndices muito grandes na memria. Acesso por mltiplas chaves. Recuperao por combinao de chaves secundrias. Listas invertidas. ndices seletivos.
4

O Que Um ndice?
ndices so chaves e campos de referncia associados a um (ou mais) registro(s). Um ndice uma maneira usada para encontrar informao.
um mecanismo de acesso a arquivos.

ndice simples (ou lineares)


Arranjos (arrays) simples contendo:
chave campo de referncia.
5

O Que Um ndice?
ndices simples utilizam arrays simples. Um ndice nos permite impor uma ordem a um arquivo sem rearranj-lo. ndices tambm nos proporcionam mltiplos caminhos de acesso a um arquivo ndices mltiplos (um catlogo de uma biblioteca fornecendo buscas por autor, ttulo, tema, etc.) Um ndice pode permitir acesso via chave a registros de tamanho varivel.
6

O Que Um ndice?
Exemplo: cadastro de musicas
Registros de tamanho varivel Chave primria = Label da gravadora + cdigo (LABEL ID)

Podemos ordenar o arquivo e fazer uma pesquisa binria?


No, pois no possvel pular para o registro do meio no arquivo, uma vez que arquivos com registros de tamanho varivel no permitem acesso direto pela PRR.
7

O Que Um ndice?
ndices Simples:
Registros de tamanho varivel Chave primria = Label da gravadora + cdigo (LABEL ID) Campo de referncia = o endereo do 1o byte do registro

O Index ordenado em memria, e os registros aparecem no arquivo na ordem que foram includos.
8

O Que Um ndice?
No exemplo anterior, como procurar por uma determinada LABEL ID?
Pesquisa Binria (na memria principal) no arquivo de ndices (Index): encontra a LABEL ID desejada, que vai nos fornecer o campo de referncia. Busca diretamente no arquivo principal, o registro na posio indicada pelo campo de referncia.

O Que Um ndice?
PROCEDURE busca_registro(CHAVE) Encontra a posio da CHAVE no arquivo de ndices (provavelmente via pesquisa binria); Calcula o BYTE_OFFSET do registro correspondente na arquivo de dados; Utiliza o SEEK() e o BYTE_OFFSET para mover para o registro; L o registro do arquivo de dados.

10

O Que Um ndice?
INDEXAO: uma alternativa ordenao do arquivo:
quando se deseja organizar um arquivo que deve ser pesquisado por chaves.
Usa-se um ndice por tipo de chave de acesso. Os ndices tm registros de tamanho fixo.

Permite:
pesquisa binria no arquivo ndice.
Com arquivo de dados tendo chave e registro de tamanho fixo ou varivel (nesse caso usa-se PRR em lugar de NRR). Acesso direto no arquivo de dados. buscando os registros no arquivo de dados por ordem de chave.
11

leitura sequencial do arquivo ndice

O Que Um ndice?
A estrutura do arquivo de ndices bem simples:
um arquivo com registros de tamanho fixo. Cada registro tem 2 campos de tamanho fixo:
Um campo chave Um campo de referncia, contendo o byte-offset.

Existe um registro no arquivo de ndices para cada registro no arquivo de dados.

No arquivo de dados, os registros permanecem na ordem em que foram inseridos (= insero temporal)
O arquivo de ndices consideravelmente mais fcil de trabalhar do que o arquivo de dados, pois seus registros tem tamanho fixo, e ele muito menor do que o arquivo de dados.

12

O Que Um ndice?
Questes que devem ser analisadas:
Como fazer um Index persistente? (ou seja, como armazenar os ndices num arquivo quando no esto na memria principal?) Como garantir que o Index seja preciso? (Principalmente quando h muitas inseres, remoes e atualizaes).

13

ndices simples com insero temporal


Os registros so inseridos no arquivo de dados na sequncia em que so gerados:
registros so gravados na sequncia temporal.

Utilizar dois arquivos:


arquivo de ndices:

O uso de um campo fixo pequeno para a chave pode causar problemas se a chave for truncada.

registro: <chave> <referncia>


tamanho fixo. limita o tamanho da chave.

arquivo de dados.
14

ndices simples com insero temporal


ndice
<chave> <referncia>
<chave> ::= chave primria (secundria). <referncia> ::= PRR (chave primria).

Insero no arquivo de dados (ou bsico)


A cada incluso de registro no arquivo bsico, inclua <chave> e <referncia> no arquivo ndice (ordenadamente)

Eliminao
A cada retirada de registro no arquivo bsico, elimine a entrada correspondente no arquivo ndice.

Recuperao
Procedimento busca-registro (j visto no slide anterior).
15

ndices simples com insero temporal


Vantagens:
adio rpida se o arquivo de ndices pode ser mantido na memria. a pesquisa binria pode ser feita na memria. recuperao:
requer uma nica leitura para recuperar o registro no arquivo bsico:

dada a chave, use pesquisa binria para recuperar a PRR. posicione no registro com um nico seek e o leia.
Por enquanto vamos assumir que o arquivo de ndices lido da memria secundria e armazenado na memria principal num array chamado INDEX[ ]. Mais tarde vamos considerar o caso em que o arquivo de ndices muito grande para ser armazenado na memria principal.
16

Operaes Bsicas de Indexao


a) b) c) d) e) f)

Criar arquivo de ndice e de dados. Carregar o arquivo de ndice para a memria. Regravar arquivo de ndice depois de us-lo. Incluir registros:
1.

no arquivo de dados e no de ndice. no arquivo de dados e no de ndice. Com mudana de chave primria. Sem mudana de chave primria.

Excluir registros:
1.

Atualizar registros:
1. 2.

17

Operaes Bsicas de Indexao


a)

Criar arquivo de ndice e de dados:


os arquivos de dados e de ndices so criados inicialmente como arquivos vazios. estes arquivos sero posteriormente carregados com seus dados.

18

Operaes Bsicas de Indexao


b)

Carregar arquivo de ndice para a memria:


assuma que o arquivo ndice caiba todo na memria em INDEX[]. leia arquivo ndice:
leia o cabealho; verifique se a data do cabealho do ndice a do arquivo de dados. se o arquivo ndice no for vlido, gere um arquivo vlido. leia os registros do arquivo ndice e coloque-os no vetor INDEX[].

a leitura rpida:
os registros do arquivo ndice so pequenos. grande quantidade deles podem estar num mesmo bloco. a leitura sequencial, h pouco movimento de brao.

19

Operaes Bsicas de Indexao


c)

Regravar arquivo de ndice depois de us-lo. Operao feita quando o INDEX[ ] alterado.

procedure regrava-ndice() { se existe alterao no vetor INDEX[ ] ento { abra um novo arquivo de ndices, ndice_arq. escreva o registro cabealho para ndice_arq. // inclua a data de atualizao grave o INDEX[] da memria no arquivo ndice_arq. feche o arquivo ndice-arq. }}
20

Operaes Bsicas de Indexao


c)

Regravar arquivo de ndice depois de us-lo.


ATENO: Devido a falhas (de energia, por ex.) a atualizao do arquivo de ndices pode no ser realizada com sucesso. Como proteo contra este tipo de erro o programa deve ter pelo menos o seguinte:
Um mecanismo que permita o programa saber quando o arquivo de ndices est desatualizado. Se o programa detectar que o arquivo de ndices est desatualizado, o programa deve acessar um procedimento que reconstrua o mesmo a partir do arquivo de dados.

21

Operaes Bsicas de Indexao


c)

Regravar arquivo de ndice depois de us-lo. MECANISMO P/ DETECTAR DESATUALIZAO DO INDEX: setar um flag assim que o arquivo de ndices em memria for modificado. Este flag poderia ser gravado no registro cabealho do arquivo de ndices em disco e limpo quando o arquivo for reescrito. Todos os programas verificariam o status do flag antes de utilizar o arquivo de ndices. Se o flag est setado, ento o programa saberia que o arquivo de ndices estaria desatualizado. RECONSTRUO DO ARQ DE NDICES: Deve acontecer automaticamente, antes de qualquer tentativa de acesso ao arquivo de ndices.

22

Operaes Bsicas de Indexao


d)

Incluir Registros Incluir registro no arquivo bsico: atravs da PRR do registro (byte_offset). no final do arquivo ou em algum espao, atualizando a LED se for o caso. Em memria! Atualizar o vetor INDEX (na memria): incluir a chave primria e a PRR na ordem certa. ativar o flag de atualizao do INDEX[ ] permite saber que o INDEX[ ] precisa ser regravado no arquivo em disco, ao trmino da aplicao.
Obs: O INDEX[] um array mantido ordenado. A insero de um novo registro no INDEX[] requer alguma reorganizao do INDEX[]. Registros tem que ser shift, etc. A grande 23 diferena aqui que o INDEX[] um array mantido (inteiramente) em memria. Todo a reorganizao do INDEX[] pode ser feita sem nenhum acesso arquivo.

Operaes Bsicas de Indexao


e)

Excluir Registros Eliminar o registro no arquivo de dados:


atualizar a LED para reaproveitar o espao.

Eliminar a entrada correspondente no INDEX[ ]


promover a reorganizao do INDEX[ ]
mantendo-o ordenado pela chave.

ativar o flag sinalizando a atualizao do vetor de INDEX.


Como o INDEX mantido em um array em memria, a reorganizao do INDEX[ ] no se torna um operao custosa.
24

Operaes Bsicas de Indexao


f)

Atualizar Registros Com mudana de chave primria:


(sem maiores consequncias).

O usurio v apenas como uma alterao!

atualizar o INDEX[ ], faz-se uma excluso e uma incluso. alterar o registro correspondente no arquivo de dados:

Sem mudana de chave primria:


se a alterao couber no espao do atual registro ento
nenhuma mudana feita no INDEX[ ].

caso no caiba, deve-se colocar o espao atual na LED e incluir em uma nova posio no arquivo de dados:
alterar a PRR da chave correspondente no INDEX[ ]. ativar o flag de atualizao do ndice.
25

Prxima Aula...
ndices muito grandes na memria. Acesso por mltiplas chaves. Recuperao por combinao de chaves secundrias. Listas invertidas. ndices seletivos

Potrebbero piacerti anche