Construção de Sistemas de Gerência de Bancos de Dados DI PUC-Rio Prof: Sérgio Lifschitz Organização de Arquivos Organização de Arquivos Tipos básicos de arquivos: heap files (entry sequenced files) sorted files hash files árvores B+ 1
Tipos de Organização de Arquivos Cada tipo possui vantagens e desvantagens SGBDs utilizam arquivos blocados Oracle: block, extent, data file SQL Server: page (8kb), extent (64 kb), data file Os SGBDs normalmente suportam: um ou mais tipos de arquivos (e variações) arquivos devem ser pensados como tabelas Acesso aos arquivos: operações básicas para todos os tipos de arquivo Operações de I/O são feitas em blocos: síncronas (um bloco), assíncronas (vários) Heap Files Organização Seqüencial (heap) mais simples existente não há ordenação dos registros Inclusão de registro: simples e eficiente Acesso e pesquisa somente pesquisa seqüencial Exclusão de registro pode ser utilizada exclusão lógica Eficiente, mas necessita reorganizações periódicas. 2
Arquivos Ordenados (1/3) Organização Seqüencial Ordenada (Sorted) pesquisa somente é interessante para campos chave. No caso: ordenado por número e nome 1 2 3 4 5 6... 39 40 Número Nome Idade Salário 1000 Ademar 25 5000 1050 Afonso 27 7000 1075 Angela 22 6000 1100 Antonio 28 2500 1300 Carlos 23 1200 1350 Cesar 25 2000... 3100 Sonia 28 3000 3150 Tatiana 20 1000 } } } bloco 1 bloco 2 bloco n Arquivos Ordenados (2/3) Inclusão de registro proibitiva se provocar deslocamento de muitos registros Estratégia: diretório de linhas no bloco Soluções: 1. reservar espaço livre em cada bloco pode não ser suficiente! 2. área de overflow (heap) associada a cada bloco acesso sequencial manutenção cara necessária a reorganização periódica 3
Arquivos Ordenados (3/3) Acesso e Pesquisa se for pelo campo de ordenação: pesquisa binária senão acesso seqüencial obrigatório pesquisa por range de chaves: muito eficiente muito bom se houver localidade de referência full scan campo de ordenação: custo de I/O min Exclusão eficiente melhor se exclusão lógica (exceto área de overflow) reorganização periódica Objetivo: acesso direto Arquivos Hash (1/4) Posiciona registro de acordo com valor da chave a uma função de cálculo de endereço (hashing) função gera endereço provável Em geral, um único I/O por bloco para obter registro desejado endereço: bloco bloco + registro no bloco Nome = Cristiano endereço = f (nome) Número Nome Idade Salário............ 1100 Antônio 28 2500............ 1140 Cristiano 20 1000............ 4
Arquivos Hash (1/4) Geralmente o conjunto de chaves possíveis >> endereços disponíveis função de hash sinônimos e colisões espaço extra: + 25% para reduzir colisões conjunto de chaves possíveis conjunto de endereços disponíveis Arquivos Hash (2/4) Funções de hashing devem ser fáceis de calcular desejável a distribuição uniforme dos registros nos blocos devem minimizar colisões devem evitar o clustering métodos de divisão e multiplicação Método de divisão: h(k) = k mod m 5
Arquivos Hash (3/4) Chaves distintas podem gerar mesmo endereço: praticamente impossível evitar colisões necessário a resolução das colisões Número Nome Idade Salário endereço Número x {900,.. 3160} f(x) = ( x - 900) / 61 endereços em [ 1, 37 ] 1075 2...... 1400 8 1440......... 8...... 3096 36 3100 36 3156 36 Arquivos Hash (3/4) Resolução de colisões: linear ou quadratic probing Exclusões dificultadas pelas colisões não basta remover registro movimentação de sinônimos Update da chave deleção + inserção 6
Tabelas Hash Resolução de Colisões 1 2 : 1 8 : 2 3 Número Nome... Elo 2400 Iara 0 1850 Edmundo 1... 1300 Carlos... 2... 2950 Sandra 18... 1 2 3 4 5 6 7 8 9 10 11 13 0 23 26 10 21 27 14 25 15 17 Tabela Headers F(x) : (x mod 11) + 1 Edmundo? F(1850) 3 Requisitos: Árvores pesquisa na estrutura do arquivo deve ser eficiente arquivo organizado em páginas menor número possível de operações de I/O para localizar um determinado registro Árvores: binária B B + 7
Árvore binária árvore completa: níveis n = 4 2 n 1 nós 2 n-1 folhas Árvore binária de Busca BST: Binary search tree: 50 25 80 12 30 77 84 8 17 75 78 81 99 2 18 76 8
Paged binary tree d c s a m u b i p t w g k n r v y e h j l o q x z f Árvores B árvores B: Bayer e McCreight (1972) viabilizaram o BD relacional características: construção: bottom up paged tree splits chaves ordenadas em cada página k chaves por página k + 1 ponteiros por página 9
Árvores B Outras características: N chaves, m ponteiros por página (ordem) número máximo de níveis d (pior caso): d 1 + log 2 (( ) ) 1 / 2 m/ N + N = 1.000.000 N = 10.000.000 m = 512 m = 512 d 3.37 3 níveis d 3.78 3 níveis * Árvores B + Adição de uma árvore B ao sequence set 43 95 58 75 23 37 03-22 23-35 37-42 43-54 58-74 75-10
Árvores B + Sequence Set: conjunto ordenado de blocos chaves ordenadas em cada bloco lista simples ou duplamente encadeada 03 11 15 23 35 36 37 40 42 43 50 54 58 73-74 Índices 11
Estruturas Auxiliares Índice: chaves e ponteiros para as linhas da tabela chave pág. 10 11 20 02 30 07 40 09 50 14 60 05 0 1 2 3 4 5 n 20 80 70 60 6 7 8 110 30 90 09 10 11 40 100 10 12 13 14 180 160 50 Índices Para localizar uma linha na tabela: com a chave percorre a estrutura do índice localiza no índice a página de dados relacionada recupera a página de dados com um I/O O ponteiro do índice é conhecido como: rid (row id), tid (tuple id) ou row locator rid / tid: file number + page number + row number normalmente entre 4 e 10 bytes 12
ÍNDICE PRIMÁRIO Arquivo ordenado por chave primária Número Nome Idade Salário Índice seletivo sobre 1 1000 Ademar campo chave primária 2 1050 Afonso referenciando blocos de 3 1075... registros 4 1100 5 1300 6 1350 Número Ender 7 1400 1 1075 3 8 1440 2 1300 5 3 1400 7... INDICE CLUSTER Arquivo Arquivo ordenado por campo não chave Índice não denso referenciando segmentos com mesmo valor para o campo de ordenação Pode-se se isolar blocos para cada valor no índice Idade 23 25 27 28 30 Índice End Núm. Nome Idade Salário 23 23 25 25 25 25 27 28 28 30 30 30 13
INDICE SECUNDÁRIO Arquivo não ordenado pelo campo referenciado pelo índice Podemos ter vários índices para um mesmo arquivo Índice ordena logicamente o arquivo Salário End 1000 1500 3000 4500 5000 6000 Índice Arquivo Núm. Nome Idade Salário 1500 3000 1000 5000 6000 4500 Índices Requisitos: pesquisa na estrutura do índice deve ser eficiente índice organizado em páginas menor número possível de operações de I/O para localizar uma determinada entrada Árvores B + 14
Índices Normalmente são variações das árvores B + index set: maior chave / menor chave de cada bloco leaf pages: apontam para os dados du 55 99 ber n cage 55 eva 64 folk 78 99 03 22 23-42 43-55 56-64 65-78 79-99 Número de níveis: Índices quase sempre 5 máximo de 5 operações de I/O para localizar uma entrada em uma leaf page níveis mais altos do index set tendem a permanecer em memória em média 1 ou 2 operações de I/O em um index probe 15
Índices Criação do índice chaves são ordenadas antes de iniciar a construção Área de SORT em memória chave únicas: Índices chave rid chave não única: chave... lista de rids SQL Server: non-clustered table: row locator = file# + page# + row# clustered table: row locator = cluster index key 16
Identificador Rid Tamanho do rid depende do gerenciador: normalmente entre 4 e 10 bytes. file# + block# + row# SQL Server: 8 bytes DB2 OS/390: tabelas < 64GB: 4 bytes tabelas > 64GB: 5 bytes Clusterização Índices podem ser utilizados para: garantir unicidade das chaves na tabela ordem física de armazenamento das linhas na tabela: cluster indexes no DB2 e SQL Server Index Organized tables no Oracle índice cluster: linhas armazenadas na seqüência da chave índice não cluster: chave do índice não influencia no posicionamento das linhas na tabela. 17
Utilização dos Índices Índices não ajudam sempre! Vários fatores influenciam na utilização de índices nos planos de acesso: Fator de filtro dos predicados, tipos de predicados, estatísticas, histogramas,... Utilização dos Índices Índices em múltiplas colunas podem tornar desnecessário o acesso a tabela - Ordem dos campos em um índice é fundamental (mais seletivo à esquerda) Índices em FKs podem ajudar na recomposição dos objetos reais 18