Escolar Documentos
Profissional Documentos
Cultura Documentos
Breno Mattos dos Reis, Hallef Henrique L. dos Reis, João Isaac Máximo, João Paulo
Gonzaga Ribeiro, João Marcos de Assis
Centro Universitário Governador Ozanam Coelho - UNIFAGOC
Graduandos em Ciência da Computação
Novembro de 2022
brenomattosreis20@gmail.com, hlrtr@hotmail.com,
joaomarcosdeassis05@gmail.com, jpgonzagaribeiro@gmail.com,
j.isaacmaximo@gmail.com
Índices Primários
Um documento estruturado com dois campos e registradores de tamanho fixo é chamado
de índice primário. O primeiro campo é o mesmo tipo de dados que o campo de
classificação, geralmente conhecido como campo de classificação primário, enquanto o
segundo campo é um ponteiro para um bloco de dados em forma de disco (um endereço
de bloco). Há uma entrada de índice (ou registro de índice) para cada bloco de dados no
banco de dados de índice. Cada entrada de índice possui valores para seus dois campos:
o valor da chave primária para o primeiro registro em um bloco e um ponteiro para esse
bloco. Discutiremos os valores desses dois campos a partir da entrada de índice por <K(i),
P(i)>.
Usamos o campo NOME como o identificador principal do artigo exibido, pois
ele serve como campo de classificação do artigo (assumindo que cada valor NOME é
único). Cada entrada no índice tem um valor NOME e um ponteiro. As três primeiras
entradas no índice são as seguintes:
Índices Clustering
Se os registros de um arquivo estiverem ordenados fisicamente de acordo com um campo
diferente de uma chave de campo, que não possui um valor único para cada registro, esse
campo é conhecido como campo de clustering (agrupamento). Para acelerar a
recuperação de registros com o mesmo valor para o campo clustering, podemos criar um
tipo diferente de índice chamado índice clustering. Esse índice difere do índice primário,
que exige um campo de classificação no arquivo de dados para ter um valor exclusivo
para cada registro.
Um arquivo ordenado com dois campos, o primeiro dos quais é um campo do tipo
clustering do arquivo de dados e o segundo é um ponteiro do tipo bloco. Há uma entrada
no índice de agrupamento para cada valor de agrupamento distinto, incluindo o valor e o
ponto para o primeiro bloco de dados no banco de dados que possui um registro com esse
valor de agrupamento. Como os registros de dados são ordenados fisicamente, ainda
surgem problemas quando os registros são incluídos ou excluídos. É prática comum
reservar um bloco inteiro (ou um grupo de blocos vizinhos) para cada valor no campo de
clustering para aliviar o problema de inclusão; Todos os registros com esse valor estão
localizados no mesmo bloco (ou grupo [cluster] de blocos), tornando a inclusão e
exclusão relativamente simples.
Outro exemplo de dispersão de índice é um agrupamento de índice, que possui
entradas para cada valor que é distinto do campo de indexação e não é um campo de
interesse definido. Como resultado, existem valores duplicados em vez de uma entrada
para cada registro de documento. De certa forma, os índices se assemelham às estruturas
de diretório usadas em hash extensivo. Ambos estão sendo procurados para identificar
um link de conexão ao bloco de dados que contém o registro desejado. Uma distinção
importante é que uma pesquisa em um índice usa os valores do próprio campo de
pesquisa, enquanto uma pesquisa em um diretório de hash usa o valor de hash, que é
determinado usando a função de hash no campo de pesquisa.
Índices Secundários
Um índice secundário fornece um meio secundário de acesso a um objeto para o qual já
existe um acesso primário. O índice secundário pode ser aplicado a um campo que seja
candidato à chave e tenha um valor único em cada registro, ou a um campo que não seja
a chave, mas tenha valores duplicados. O índice é uma matriz ordenada de dois campos.
O primeiro é o mesmo tipo de dados de algum outro campo que não seja o campo de
classificação para o arquivo de dados, que é um campo para indexação. O segundo é um
bloco ou ponto de registro. Pode haver vários índices secundários (e, vários campos de
indexação) para o mesmo arquivo.
Figura 3. Arquivo de Índice 2
Primeiro, vamos dar uma olhada em uma estrutura de acesso de índice secundário
em um campo-chave que possui um valor único para cada registrador. Às vezes, essa área
é chamada de chave secundária. Neste caso, há uma entrada para cada registro de dados
no banco de dados que contém o valor da chave secundária no registro e um link para o
bloco onde o registro está armazenado ou para o próprio registro. Assim, o indicador é
denso.
Agora nos referimos aos dois valores nos campos de entrada do indicador como
<K(i), P(i)>. Para nos permitir realizar uma busca binária, as entradas são organizadas
conforme o valor de K(i). Não podemos usar âncoras de blocos, pois os registros de dados
no arquivo de dados não são ordenados fisicamente pelos valores do campo chave
secundária. Como resultado, em vez de uma entrada para cada bloco como no caso do
índice primário, é criada uma entrada para cada registro na estrutura de dados. Uma busca
pelo registro desejado no bloco pode ser executada uma vez que o bloco apropriado tenha
sido movido para a memória principal.
Dado seu maior número de entradas, um índice secundário geralmente requer mais
espaço de armazenamento e mais tempo para pesquisar do que um índice primário. No
entanto, a melhoria no tempo de busca de um registro selecionado arbitrariamente é muito
maior em um índice secundário do que em um índice primário, pois, na ausência do índice
secundário, uma busca linear teria que ser realizada no arquivo de dados. Mesmo que o
índice primário não existisse, ainda poderíamos fazer uma pesquisa binária no documento
principal.
Figura 4. Arquivo de Índice 3
Um índice clustering com um grupo (cluster) separado de blocos para cada grupo de
registros que compartilhem o mesmo valor de campo de clustering.
Exemplo 2: Pegue a estrutura do Exemplo 1 com 30.000 registros de tamanho fixo e R =
100 bytes armazenados em um disco com tamanho de bloco B = 1,024 bytes. A estrutura
possui b = 3.000 blocos, conforme calculado no Exemplo 1. Uma busca linear no
documento precisaria de b/2 = 3.000/2 = 1.500 acessos médios a cada bloco. Suponha que
criamos um índice secundário com base em um campo do documento diferente do campo
de classificação e que seu tamanho é V = 9 bytes. Como no Exemplo 1, o ponteiro de um
bloco tem 6 bytes de tamanho,
Além disso, podemos criar um índice secundário em um campo que não seja o
campo de palavra-chave do arquivo. Nesse caso, vários registros do arquivo podem
compartilhar o mesmo valor no campo de indexação. Existem várias opções de
implementação para este índice:
A primeira opção envolve a inclusão de várias entradas de índices com o mesmo
valor de K(i) – uma para cada registrador. Isso seria um índice denso.
A segunda opção implica ter registros de comprimento variável nas entradas do
índice e um campo de vários valores para o ponteiro. Criamos uma lista de ponteiros
<P(i,1),…, P(i, k)> na entrada de índice para K(i), um ponteiro para cada bloco contendo
um registrador cujo valor do campo de índice é igual para K(i). O algoritmo de busca
binária para o indicador precisa ser alterado de acordo em ambos os casos.
A terceira e mais popular opção envolve manter o tamanho das entradas de índice
individuais e ter uma única entrada para cada valor no campo de índice, bem como criar
um nível adicional de indireção para lidar com vários ponteiros. Nesse diagrama
equilátero, o ponteiro P(i) na entrada do índice aponta para um grupo de ponteiros de
registro, e cada ponteiro de registro nesse grupo aponta para um dos registros no arquivo
de dados com o valor K(i) na indexação campo. É usado para criar um grupo de blocos
(um cluster) ou uma lista ordenada de blocos quando um determinado valor de K(i) ocorre
com frequência nos registradores, impedindo que seus polos se agrupem em um único
bloco do disco.
Um í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.
Esteja ciente que o índice secundário fornece uma ordem lógica para os registros
com base no campo de indexação. Obteríamos o mesmo resultado na ordem dos campos
de indexação se acessássemos os registros na ordem das entradas no índice secundário.
Resumo
Podemos repetir este método para alcançar o próximo nível. Existe uma entrada
para cada bloco do segundo nível no terceiro nível, que serve como um índice primário
para o segundo nível. Como resultado, o número de entradas no terceiro nível é
O esquema multinível descrito aqui pode ser aplicado a qualquer tipo de índice,
seja primário, de agrupamento ou secundário, desde que o índice no nível superior tenha
valores distintos para K(i) e entradas de tamanho fixo. A melhoria no número de blocos
acessados quando um índice multinível é usado para pesquisar um registro é visto no
Exemplo 3.
Um indicador primário de dois níveis que é semelhante à organização ISAM
(Indexed Sequential Access Method — Método de Acesso Sequencial Indexado).
Observe que também podemos ter um índice multinível primário que pode ser
expandido. De acordo com um índice denso, isso pode ser determinado acessando o
primeiro nível do índice (sem ter que acessar um bloco de dados), pois há uma entrada de
índice para cada registro no arquivo.
Uma estrutura organizacional comum para documentos usados em aplicativos de
processamento de dados comerciais é um arquivo organizado usando um índice primário
multinível baseado em seu campo de classificação. Esse tipo de organização é conhecido
como “arquivo sequencial ordenado” sendo usado em um número significativo dos
primeiros sistemas IBM. A inclusão é tratada por algum tipo de estrutura de overflow que
é adicionada periodicamente ao arquivo de dados. O índice é criado durante a
reorganização. A organização ISAM da IBM inclui um índice de dois níveis que se
assemelha muito à estrutura organizacional do disco. O primeiro nível é um índice de
cilindro, que inclui um ponteiro para o índice de trilha do cilindro e o valor da chave de
um registro de âncora para cada cilindro no pacote de discos. O valor chave do índice da
trilha é representado por um registro âncora para cada trilha do cilindro e um ponteiro
para cada trilha. Assim, uma trilha pode ser buscada sequencialmente pelo registro ou
bloco desejado.
Árvores de busca.
Uma árvore de busca é um pouco diferente de um índice multinível. Uma árvore
de busca de ordem p é uma árvore na qual cada nó tem pelo menos p - 1 valores de busca
e p ponteiros na ordem <P1, K1, P2,K2,..., Pq-1, Kq-1, Pq>, onde q ≤ p ; cada Pi é um ponteiro
para um nó filho (ou um ponteiro nulo); e cada Ki é um valor de busca para alguma
coleção ordenada de valores. Todos os valores de pesquisa são considerados exclusivos.
Em uma árvore de busca, dois requisitos sempre devem ser atendidos:
1. Dentro de cada nó, K1 < K2 < ... < Kp-1.
2. Para todos os valores X na subárvore apontada por Pi, temos Ki-1< X < Ki para
1 < i < q; X < Ki para i = 1; e Ki-1 < X para i = q.
Árvores-B.
As árvores-B possuem requisitos adicionais que garantem que uma árvore esteja sempre
em estado de equilíbrio e que qualquer espaço excluído nunca se torne excessivo. Para
lidar com essas condições, no entanto, os algoritmos de inclusão e exclusão tornam-se
mais sofisticados. No entanto, a maioria das operações que envolvem inclusões e
exclusões são diretas; eles só se complicam em circunstâncias inusitadas, ou seja, sempre
que tentamos incluir alguém que já está totalmente formado ou excluir alguém para ficar
com menos da metade de seu potencial restante. Mais especificamente, uma árvore B de
ordem p pode ser definida da seguinte forma quando utilizada como estrutura de acesso
em um campo de busca de registros em um banco de dados:
1.Cada nó interno da árvore-B é: <P1, <K1, Pr1>, P2, <K2, Pr2>, . . . , <Kq-1, Prq-1>,
Pq>.
onde q ≤ p. Cada Pi é um ponteiro de árvore conectando um nó da árvore B a
outro. Cada Pri é um link de dados que se conecta a um registro cujo valor do campo de
pesquisa é igual a Ki.
Árvores-B+
A maioria das implementações de indicadores multinível usa uma versão adaptada da
estrutura de dados árvore-B chamada árvore-B+. Cada valor do campo de pesquisa em
uma árvore do tipo B aparece uma vez em um ponteiro de dados em algum nível da árvore.
A estrutura das folhas de uma árvore-nós B+ difere da estrutura de nós internamente
porque os ponteiros de dados são armazenados apenas lá. Se o campo de pesquisa for um
campo de caixa de seleção, nossos arquivos incluirão uma entrada para cada valor,
juntamente com um ponteiro de dados para o registro (ou para o bloco que contém o
registro).Em um campo de pesquisa que não seja um campo de palavra-chave, o ponteiro
aponta para um bloco que contém ponteiros para os registros do arquivo de dados,
adicionando um nível indireto.
As nó folhas de uma árvore B+ são normalmente conectadas umas às outras para
fornecer acesso organizado aos registros do campo de pesquisa. Esses nós se assemelham
ao primeiro nível (base) de um indicador. Os nós internos de uma árvore B+
correspondem aos outros níveis de um indicador multinível. Para direcionar a busca,
vários valores do nosso campo interno de busca árvore-B+ são repetidos. A estrutura dos
nós internos de uma árvore-B+ de ordem p é a seguinte:
1. Cada nó interno é da forma:
<P1, K1, P2, K2, . . . , Pq-1, Kq-1, Pq>
onde q ≤ p e cada Pi é um ponteiro de árvore.
2. Dentro de cada nó interno K1 < K2< … <Kq-1.
3. Para todos os valores X do campo de busca na subárvore apontada por Pi, temos:
Ki–1 < X ≤ Ki para 1 < i < q; X ≤ Ki para i = 1; e Ki–1 < X para i = q.
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.
4. Cada nó interno possui no máximo p ponteiros de árvore.
5. Cada nó interno possui pelo menos ponteiros de árvore. O nó raiz possui pelo
menos dois ponteiros de árvore se ele é um nó interno.
Hashing Particionado
O hash particionado é uma extensão do hashing estático externo que permite o acesso
com base em várias senhas. Ele é apropriado apenas para comparações de igual valor;
consultas de intervalo não são tratadas. Ao participar do hashing, a função hash tem como
objetivo produzir um resultado para uma chave que contém n componentes.
Com endereços hash distintos. O endereço do bucket é uma combinação desses n
endereços. Portanto, é possível encontrar uma frase de pesquisa solicitada procurando nos
intervalos apropriados que correspondem às partes do endereço em que estamos
interessados.
Considere uma chave de busca composta, por exemplo. Obteríamos um endereço
de bucket de 8 bits se NRD e IDADE fossem submetidos a codificações de hash de 3 e 5
bits, respectivamente. Assuma que NRD = 4 tem o endereço hash "100" e que IDADE =
59 tem o endereço hash "10101". Portanto, para buscar por NRD = 4 e IDADE = 59,
deve-se ir ao endereço do bucket 100 10101; da mesma forma, para buscar todos os
funcionários com IDADE = 59, devem ser pesquisados todos os buckets (oito deles) cujos
endereços sejam "000 10101", "001 10101" etc. Um benefício de participar do hashing é
que é simples estendê-lo a qualquer um dos atributos. O endereço do buckets pode ser
projetado de forma que os bits estejam na ordem correta.
Arquivos Grid
Outra opção é configurar o arquivo EMPREGADO como uma grade de documentos. Se
quiséssemos acessar um segundo conjunto de duas chaves, digamos NRD e IDADE,
como no nosso exemplo, poderíamos construir uma matriz com escala (ou dimensão)
linear para cada um dos atributos de busca. A Figura abaixo mostra uma matriz para o
objeto EMPREGADO com uma escala linear para NRD e outra para IDADE. Para obter
uma distribuição uniforme desse atributo, as escalas são definidas. Desta forma, nosso
exemplo demonstra que a escala linear NRD possui NRD = 1, 2 combinado como valor
0 da escala, enquanto NRD = 5 corresponde ao valor 2 da escala.
Como resultado, nossa requisição para NRD = 4 e IDADE = 59 mapeia a célula
(1,5) de acordo com a matriz. O bucket relevante incluirá os registros para essa
combinação. Essa metodologia é particularmente útil para consultas de intervalo que
convertem uma coleção de células em um conjunto de valores ao longo de escalas
lineares. A ideia de uma grade arquitetônica pode, teoricamente, ser aplicada a qualquer
número de critérios de pesquisa. Os critérios de pesquisa estabelecem que a matriz deve
ter várias dimensões. Como resultado, a matriz possibilita a divisão do objeto nas
dimensões dos atributos de busca e fornece acesso por meio da combinação de valores
nessas dimensões. Os documentos em grade têm um bom desempenho em termos de
aceleração do acesso à informação.
Referências:
Algoritmos e Estruturas de Dados II - ORGANIZAÇÃO DE ARQUIVOS INDEXADOS
- Prof. Osvaldo Alves dos Santos
ACH2024 Índices (Acesso indexado) - Prof. Helton Hideraldo Bíscaro
Banco de Dados I Estruturas de Índices para Arquivos - Jhonata R.de Peder Marcelo
Schuck
Estruturas de Indexação de Dados Tipos de Índices- Profa. Dra. Cristina Dutra de Aguiar
Ciferri
Sistemas de Banco de Dados - 4ª edição - Elmasri, Ramez; Navathe, Shamkant B.