Acesso Sequencial Indexado Objetivo Considerar de forma unificada
Acesso Sequencial Indexado Objetivo: Considerar de forma unificada as seguintes visões sobre estruturas de acesso a arquivos: • Visão indexada: o arquivo é visto como um conjunto de registros indexados por chaves. • Visão sequencial: o arquivo pode ser acessado sequencialmente, gerando registros ordenados por chaves.
Exemplo: Operações cosequenciais + operações indexadas ler um arquivo “inteiro” (menos seek) ler cada chave para acessar os registros para, por exemplo, ordená-lo Acesso Sequencial Indexado
Conjuntos de sequência de registros Objetivo: manter dinamicamente um conjunto de registros ordenados por chaves no disco Problema: ordenação do arquivo em disco é “cara”! Solução: • organizar os registros em blocos operações locais • um bloco se torna a menor unidade endereçável nas operações de leitura e escrita no disco (é carregado todo na RAM).
Exemplo: Chaves = nomes 4 nomes/bloco (fator de bloco) Chaves: Adams Baird Bixby Boone Bynum Carson Cole Davis Denver Ellis
bloco 1 Adams Baird bloco 2 bloco 3 Bynum Carson Denver Ellis Bixby Boone Cole Davis Introduzir Carter : bloco 1 bloco 2 bloco 3 bloco 4 Adams Baird Bynum Carson Denver Ellis Cole Davis Bixby Carter Boone subdivisão (split) de bloco
Eliminar Davis : bloco 1 bloco 2 bloco 3 bloco 4 Adams Baird Bynum Carson Denver Cole Bixby Boone Carter Ellis underflow
Eliminar Davis : bloco 1 bloco 2 Adams Baird Bynum Carson Bixby Carter bloco 3 bloco 4 Boone disponível Cole Denver Ellis concatenação Conclusão: o arquivo inteiro pode ser mantido ordenado apenas pela ordenação de suas partes (blocos).
Problemas: • A ordenação do arquivo pode exigir mais espaço em disco por conta de fragmentações internas. Neste caso, pode-se adotar estratégias que privilegiem a redistribuição de chaves. • A ordem física dos registros só é garantida ao longo de um bloco e não entre-blocos. Qual deve ser o tamanho de um bloco? -Deve representar um compromisso entre tempo de acesso, memória RAM (buffer) disponível e as operações a serem executadas. • O tamanho do bloco deve permitir o armazenamento de vários destes na memória. • O tempo de leitura e escrita de um bloco não deve ser muito longo (para não perder o que se ganhou economizando-se em seeks).
Sequência de registros e indexação Objetivo: definir um método eficiente que possibilite o acesso a um bloco contendo uma chave (ou registro) procurada. Ideia: construir um índice de chaves (a partir do último registro de cada bloco, por exemplo), apontando para cada um destes blocos. Sequência de blocos: Adams-Berne Bolen-Cage Camp-Dutton Embry-Evans Faber-Folk 1 2 3 4 5 Folks-Gaddis 6
Adams-Berne Bolen-Cage Camp-Dutton Embry-Evans Faber-Folk 1 2 Chave Berne Cage Dutton Evans Folk Gaddis 3 4 Número do Bloco 1 2 3 4 5 6 Índices da sequência de blocos 5 Folks-Gaddis 6
Chaves delimitadoras • Os índices servem apenas de guia na busca do bloco que contém a chave a ser acessada delimitadores • Menor delimitador possível (não-único) economia de espaço (neste caso, teremos uma árvore B+ de prefixo simples) Delimitadores de blocos CAM BO F E FOLKS Adams-Berne Bolen-Cage Camp-Dutton Embry-Evans Faber-Folk 1 2 3 4 5 Folks-Gaddis 6
Arquivo sequencial indexado e árvore B+ de prefixo simples E conjunto de índices BO F CAM FOLKS Adams-Berne Bolen-Cage Camp-Dutton Embry-Evans Faber-Folk 1 2 3 4 5 Folks-Gaddis 6
A busca • A partir dos índices na árvore B, podemos acessar um bloco da seguinte forma: 1. Se chave procurada < delimitador, então vá para a esquerda na árvore 2. se chave >= delimitador, então vá para a direita na árvore Lembrando: Árvore B+ de prefixo simples os delimitadores são os menores possíveis na árvore B
Operações sobre árvores B+ • Supressão de registros sem originar concatenação e redistribuição alterações apenas nos blocos de registros; o conjunto de índices não é alterado • Inserção sem subdivisão idem E conjunto de índices BO CAM F FOLKS Adams-Berne Bolen-Cage Camp-Dutton Embry-Evans Faber-Folk 1 2 3 4 5 Folks-Gaddis 6
Apagar Embry e Folks E BO F CAM FOLKS Adams-Berne Bolen-Cage Camp-Dutton Embry-Evans Faber-Folk 1 2 3 4 5 Folks-Gaddis 6 E BO Adams-Berne 1 F CAM Bolen-Cage Camp-Dutton 2 3 FOLKS Ervin-Evans Faber-Folk 4 5 Frost-Gaddis 6
• Inserção causando subdivisão mudanças no número de blocos de registros alteração no conjunto de índices através das regras aplicadas às árvores B. • Supressão com redistribuição e/ou concatenação idem
Inserir Ayers E BO Adams-Berne CAM F Bolen-Cage Camp-Dutton 1 Ervin-Evans Faber-Folk 4 5 3 2 FOLKS Frost-Gaddis 6 Ayers (causa subdivisão do bloco 1 com criação do bloco 7) BO CAM AY Adams-Avery 1 E F Ayers-Berne Bolen-Cage Camp-Dutton 7 2 3 FOLKS Ervin-Evans Faber-Folk 4 5 Frost-Gaddis 6
• Supressão com underflow concatenação dos blocos de registros BO CAM AY Adams-Avery 1 E F Ayers-Berne Bolen-Cage Camp-Dutton 7 2 3 FOLKS Ervin-Evans Faber-Folk 4 5 Frost-Gaddis 6 remoções no bloco 2 causam underflow e subsequente concatenação com o bloco 3, o qual pode ser colocado numa avail list
BO CAM AY Adams-Avery E F Ayers-Berne Bolen-Cage Camp-Dutton 7 1 2 FOLKS Ervin-Evans Faber-Folk 4 5 3 Frost-Gaddis 6 concatenação E AY BO F Adams-Avery Ayers-Berne Bolen-Dutton 1 7 2 FOLKS Ervin-Evans Faber-Folk Frost-Gaddis 4 5 6
Assim: • Se blocos de registros são subdivididos um novo delimitador é necessário no conjunto de índices • Se blocos são concatenados um separador deve ser removido do conjunto de índices • Se registros são redistribuídos entre blocos da sequência de registros o delimitador no conjunto de índices deve ser atualizado
Blocos de Conjunto de Índices (delimitadores) • Os índices podem ser armazenados em blocos, tal como os registros (de mesmo tamanho dos blocos dos registros) • Os delimitadores podem ser de tamanho variável grande número de delimitadores em um bloco de índice árvore menos profunda. Uma busca binária pode ser feita sobre estes delimitadores armazenados em RAM
Exemplo de estrutura de um bloco de índice As. Bro. CCh. Cra. Dele. Edl. Err. Fa. Fle delimitadores concatenados 00 02 04 07 08 10 13 17 20 23 25 NRR dos delimitadores Número de delimitadores Tamanho total dos delimitadores 11 28 As. Bro. CCh. Cra. Dele. Edl. Err. Fa. Fle 00 02 04 07 08 10 13 17 20 23 25 B 00 B 01 B 02 B 03 B 04 B 05 B 06 B 07 B 08 B 09 B 10 B 11 delimitadores NRR dos delimitadores Número relativo dos blocos
Número de delimitadores Tamanho total dos delimitadores 11 28 As. Bro. CCh. Cra. Dele. Edl. Err. Fa. Fle 00 02 04 07 08 10 13 17 20 23 25 B 00 B 01 B 02 B 03 B 04 B 05 B 06 B 07 B 08 B 09 B 10 B 11 delimitadores NRR dos delimitadores Número relativo dos blocos Nível conceitual: ordem dos delimitadores 0 1 2 3 4 5 6 7 8 9 B 00 As B 01 Bs B 02 Bro B 03 C B 04 Ch B 05 Cra B 06 Dele B 07 Edi B 08 Err B 09 Fa 10 B 10 Fle B 11
Criação sequencial da árvore B+ Problema: A criação aleatória da árvore ( com registros introduzidos não-ordenadamente à medida que chegam) envolve operações de subdivisão e redistribuição que são “caras”. Ideia: Ordenar o conjunto dos registros que comporão a árvore, armazenando-os sucessivamente nos blocos os registros são armazenados na ordem correta. Para cada bloco é definido o seu delimitador que, em seguida, é armazenado no bloco de índices (contido na memória até que o bloco esteja cheio)
Exemplo: ALWASPBET 00 03 06 Access-Also Always-Ask Aspect-Best Better-Cast
Catch-Check Novo bloco CAT -1 ALWASPBET 00 03 06 Access-Also Always-Ask bloco sem delimitadores! 00 -1 -1 Aspect-Best Better-Cast -1 -1 Catch-Check
Class-Copy Novo bloco 00 CAT ALWASPBET 00 03 06 CL -1 00 -1 -1 Access-Also Always-Ask Aspect-Best Better-Cast Catch-Check Class-copy -1
Cost-Damage Novo bloco 00 CAT ALWASPBET 00 03 06 CL COS -1 -1 00 02 -1 Access-Also Always-Ask Aspect-Best Better-Cast Catch-Check Class-copy Cost-Damage
Delete-Dise Novo bloco CAT ALWASPBET 00 03 06 00 CL COS DE -1 -1 00 02 05 Access-Also Always-Ask Aspect-Best Better-Cast Catch-Check Class-copy Cost-Damage Delete-Dise
Drum-Editor Novo bloco CATDR ALWASPBET 00 03 06 00 CL COS DE 03 -1 00 02 05 Access-Also Always-Ask Aspect-Best Better-Cast Catch-Check Class-copy Cost-Damage Delete-Dise Drum-Editor -1 -1 -1
Effort-Crow Novo bloco CATDR ALWASPBET 00 03 06 00 CL COS DE 03 -1 00 02 05 EF Access-Also Always-Ask Aspect-Best Better-Cast Catch-Check Class-copy Cost-Damage Delete-Dise Drum-Editor Effort-Crow 00 -1 -1
Head-Ideal Novo bloco CATDR ALWASPBET 00 03 06 00 CL COS DE 03 -1 00 02 05 EFH 00 02 -1 Access-Also Always-Ask Aspect-Best Better-Cast Catch-Check Class-copy Cost-Damage Delete-Dise Drum-Editor Effort-Crow Head-Ideal
Ignore-Item Novo bloco CATDR ALWASPBET 00 03 06 00 CL COS DE 03 -1 00 02 05 EFHIG 00 02 03 Access-Also Always-Ask Aspect-Best Better-Cast Catch-Check Class-copy Cost-Damage Delete-Dise Drum-Editor Effort-Crow Head-Ideal Ignore-Item
Separadores Completos ALWAYSASPECTBETTER Access-Also Always-Ask 00 06 12 Aspect-Best Better-Cast
Referência: - Michael J. Folk e Bill Zoellick. File Structures, Second Edition, Addison-Wesley, 1992.
- Slides: 35