Estruturas de Armazenamento e Indexação Rafael Lage Moreira Barbosa 10.1.4217 Estruturas de Armazenamento • Banco de Dados são armazenados fisicamente como arquivos de registro, que em geral ficam em discos magnéticos; • O software do SGBD pode recuperar, atualizar e processar esses dados conforme uma necessidade. • A mídia de armazenamento do computador forma uma hierarquia de armazenamento que inclui duas categorias principais: • Armazenamento primario; • Armazenamento secundario e terciario. Armazenamento Primário • Memória Principal; • Caches menores; • Oferece acesso rápido; • Capacidade limitada; Armazenamento secundário e terciario • Disco magnéticos, discos ópticos, flash drives e fitas; • Secundária: Discos rígidos; • Terciária: Mídia removível; • Não podem ser processadas diretamente pela CPU. Armazenamento de banco de dados • Bancos de dados costumam armazenar grande quantidade de dados que precisam persistir por longos períodos de tempos, portanto, eles costumam ser considerados dados persistentes; • A maioria dos bancos de dados são armazenados no armazenamento secundário pelo seguintes motivos: • Muito grandes para caber na memória principal; • Circunstâncias que causam perda de dados ocorrem com menos frequência, armazenamento não-volátil; • As aplicações de bancos de dados típicas só precisam de uma pequena parte do banco de dados de cada vez para processamento. • Sempre que certa parte de dados é necessária, ela precisa ser localizada no disco, copiada para a memória principal para processamento e, depois, reescrita para o disco se os dados forem alterados; • Os dados armazenados no disco são organizados como arquivos de registro. Cada registro é uma coleção de valores de dados; • Os registros devem ser armazenados em disco de uma maneira que torne possível localizá-los de modo eficiente quando necessário; • Existem vária organizações de arquivo primário, que determinam como os registro de arquivo são colocados fisicamente no disco, e daí os registros podem ser acessados; Buffering de blocos • Quando vários blocos precisam ser transferidos do disco para a memória principal e todos os endereços de bloco são conhecidos, vários buffers podem ser reservados na memória principal para agilizar a transferência. • Enquanto um buffer está sendo lido ou gravado, a CPU pode processar dados em outro buffer. Processamento Intervalado e Paralelo Registros e tipos de registro • Os dados costumam ser armazenados na forma de registro; • Cada registro contém uma coleção de valores ou items Arquivos de registro desordenados(arquivos de heap) • Registros são arquivados na ordem em que são inseridos, novos registros são inseridos ao final do arquivos; • Inserção é muito eficiente, copia-se o ultimo bloco para o buffer, acrescenta-se o novo registro e então o bloco e regravado de volta no disco; • Para excluir o programa deve encontrar o bloco, copiar para um buffer, excluir o registro de volta no disco. (Deixa espaço livre no bloco de disco) Arquivos de registro ordenados(arquivos classificados) • Registro ordenados fisicamente no arquivo com base nos valores de um de seus campos; • A leitura de registros na ordem dos valores da chave de ordenação é extremamente eficiente; • Encontrar o próximo registro com base no atual não requer acesso de blocos adicionais; • Acesso mais rápido quando a técnica de pesquisa binária é usada. Técnicas de Hashing • Oferece acesso muita rápido aos registros; • A partir de uma chave hash, encontramos o registro através de uma função de hash; Hashing externo para arquivos de disco • Chamado de hashing externo; • O espaço de endereços de destino é feito em buckets; • Um bucket é um bloco de disco com um cluter de blocos de disco contíguos. • A função hashing mapeia uma chave em um númeto de bucket relativo; • Uma tabela mantida no cabeçalho do arquivo converte o número de bucket para o endereço de bloco de disco. Técnicas de hashing que permitem a expansão dinâmico do arquivo • Hashing extensível: um tipo de diretório mantido, o valor de hash é utilizado como índice para um array; • Hashing dinâmico: mantêm um diretório estrurado em árvore; • Hashing linear: permite que um arquivo de hash expanda e encolha seu número de buckets dinamicamente sem precisar de um diretório. Hashing extensível Hashing dinâmico Estruturas de indexação • Estruturas de acesso auxiliares, chamadas de índices, par agilizar recuperação de registro; • São arquivos adicionais no disco que oferecem caminhos de acesso secundários, os quais oferecem formas alternativas de acessar os registros sem afetar seu posicionamento físico no arquivo de dados primário do disco; • Elas permitem acesso eficiente aos registros com base nos campos de indexação; Tipos de índices • Índices ordenados de único nível(baseados em arquivos ordenados); • Índice multi-nível(estruturas de dados em árvore, árvore=B); • Hashing; • Índices bitmap(vetores de bits). Tipos de índices ordenados de único nível • Ideia: semelhante à que está por trás do índice usado em um livro; • Podemos pesquisar o índice do livro em busca de certo termo em seu interior e encontrar um lista de endereços - números de página, nesse caso - e usar esses endereços para localizar páginas especificadas primeiro e depois procurar o termo em cada página; • Existem vários tipos. Índices primários • Arquivo ordenado; • Dois campos: chave primária, ponteiro para o bloco de disco; • O Arquivo de índice para um índice primário ocupa um espaço muito menor do que o arquivo. Índice primário Indicie primário no campo de chave de ordenação Índices de agrupamento • Se os registros de arquivo forem fisicamente ordenados em um campo não chave - que não tem um valor distinto para cada registro -, esse campo é chamado de campo de agrupamento; • Utilizado para agilizar a recuperação de todos os registros que têm o mesmo valor para o campo de agrupamento Índice de agrupamento no campo não chave de ordenação Índice secundário • Meio secundário para acessar um arquivo de dados par o qual já exista algum acesso primário; • Dois campos: campo de índice, ponteiro de bloco; Índice de agrupamento com um cluster de bloco separada para cada grupo de registros do mesmo valor Índices multi-níveis • No minimo níveis de índice; • A ideia é reduzir a parte do índice; • Logo, o espaço de pesquisa reduzido mais rapidamente Índice primário de dois níveis Índices multi-níveis dinâmicos usando B-trees e B*-trees Árvores de pesquisa • Índices multi-níveis podem ser imaginas como uma variação de árvore de pesquisa; • Cada nó no índice multi-nível pode ter inúmeros ponteiros e valores de chave; • Os valores de índice e cada nó nos guiam para o próximo nó, até que alcancemos o bloco do arquivo de dados; • Ao seguir um ponteiro, restringimos a pesquisa em cada nível a uma sub-árvore da árvore de pesquisa e ignoramos todos os nós fora dessa sub-árvore Um nó em um árvore de pesquisa com ponteiro para sub-árvores abaixo dela Árvore de pesquisa • Necessários algoritmos para inserir e excluir valores; • Em geral, não garantem que seja balanceada. • Aumenta profundidade da árvore e torna a velocidade de pesquisa heterogênea; B-tree • Cada valor do campo aparece uma vez em algum nível na árvore, junto com o ponteiro de dados; • Ponteiros são apenas armazenados nos nós folha da árvore; • Nós folha têm um ponteiro de dados para o registro(ou bloco de registro), se o campo de pesquisa for um campo de chave; • Para um campo de pesquisa não chave, o ponteiro aponta para um bloco que cont´m ponteiros para os registro de aqruivo; • Nós folha normalmente são ligados para oferecer acesso ordenado no campo de pesquisa; • Nós folha são semelhantes ao primeiro nível de um índice, nós internos a um índice multi-nível; • Cada nó interno tem a forma: <P1,K1,P2,K2,…> • • Pn é ponteiro de árvore; Cada nó folha tem a forma: <<K1,Pr1>,<K2,Pr2>, …,Pproximo> • Prn é ponteiro de dados; B*-tree • A maioria das implementações de índice multi-nível dinâmico utilizam; • Ponteiros de dados são armazenados apenas nos nós folhas da árvore Exemplo: pesquisa Índices e múltiplas chaves • Quando vários atributos são envolvidos; • Exemplo: Funcionário cujo departamento = 4 e idade = 59; • Se cada conjunto que atendem a cada condição for grande, técnicas comuns não serão eficientes. Hashing particionado • Extensão do hashing externo estático, que permite acesso a múltiplas chaves; • Adequado apenas para comparações de igualdade; • Pode ser facilmente estendido par n número de atributos; • <Dnr, Idade> • Endereço de Hash de Dnr = ‘100’; • Endereço de Hash de Idade = ‘10101’; • Para procurarmos vamos ao endereco 100 10101. Arquivos de grades Índice de hash • O índice é uma estrutura secundária para acessar o arquivo usando hashing em uma chave de pesquisa; • <K, Pr> : Pr é um ponteiro de registro que contem a chave; • <K, P> : P é um ponteiro para o bloco de registro índices bitmap • Usada para relações que contêm grande número de linhas; • Cria um índice para uma ou mais colunas, e cada valor ou intervalo de valores nessas colunas é indexado; • Converte o valor em um vetor de bits; • Para encontrar utiliza interseção dos bitmaps; Indexação baseada em função • Criar um índice tal que o valor que resulta da aplicação de alguma função em um campo ou uma coleção de campos torna-se a chave para o índice;