Bases de Dados Índices Discos transferência lenta e em blocos (512B ~ 4KB) transferência rápida e aos bytes memória disco BD / aplicação 2 1
Discos 7200rpm = 120 rot/s 1 5 platters Ø 8.9 cm 50000 ~ 100000 tracks per platter sector = 512 B ~ 500 sectors per (inner) track ~ 1000 sectors per (outer) track 3 Acesso aos dados Os dados são transferidos entre o disco e a memória em blocos um bloco abrange vários sectores contíguos É objectivo de qualquer SGBD minimizar o número de transferências de blocos entre disco e memória 4 2
Índices Índices permitem acelerar o acesso aos dados p.ex. índice remissivo de um livro assunto é a chave de procura (search key) nº da página é o apontador Um índice contém registos na forma chave de procura apontador(es) para registo(s) em geral é muito mais pequeno que a tabela indexada 5 Índices Consulta sem índice pesquisa sequencial pode ser muito lenta para tabelas grandes 6 3
Índices Consulta com índice pesquisa no índice é muito rápida, mesmo para tabelas grandes 7 Índices ordenados Numa tabela pode haver 2 tipos de índices índice primário (clustered) indexa a coluna pela qual os dados estão ordenados normalmente é a chave primária, mas pode não ser índice secundário (non-clustered) indexa uma coluna que não aquela pela qual os dados estão ordenados este índice especifica uma ordem diferente da tabela se os dados não estiverem ordenados pela chave primária, então o índice para a chave primária é secundário 8 4
Índices primários (clustered) índice índice 9 Índices secundários (non-clustered) índice índice índice índice 10 5
Índices densos Um índice é denso se refere todos os valores possíveis da chave de procura 11 Índices esparsos Um índice é esparso se contém entradas para apenas alguns dos valores da chave de procura 12 6
Índices esparsos Índices esparsos só podem ser usados quando os registos estão ordenados por essa chave (índice primário) para localizar o registo com valor K procurar a entrada no índice com o maior valor < K pesquisar a tabela sequencialmente a partir daí 13 Índices esparsos Vantagens/desvantagens dos índices esparsos menos espaço e manobras de inserção/remoção mais lento a localizar os registos pretendidos na tabela melhor compromisso é um índice esparso com uma entrada para cada bloco que a tabela ocupa em disco o valor indexado correspondente ao menor valor da chave de procura nesse bloco 14 7
Índices multi-nível Se um índice primário não couber todo na memória, o acesso complica-se para reduzir o número de acessos ao disco, trata-se o índice como uma tabela e cria-se um índice esparso para o índice primário se este for demasiado grande para caber em memória, cria-se ainda outro nível Os índices têm de ser mantidos actualizados em todos os níveis 15 Índices multi-nível 16 8
Actualização de índices Ter um índice implica custos de manutenção Remoção ao remover o único registo com um dado valor, remove-se a respectiva entrada do índice Inserção pesquisar o valor do registo no índice índices densos se o valor não estiver indexado, inserir nova entrada no índice índices esparsos só é necessário criar uma nova entrada se a inserção der origem a um novo bloco 17 Índices secundários Um índice secundário pode ser necessário para fazer pesquisas por outro critério/coluna exemplos: com a tabela account ordenada por account_number encontrar todas as contas de uma dada agência encontrar todas as contas de uma agência e com saldo numa dada gama de valores é possível ter um índice secundário para cada uma destas chaves de procura o índice aponta para um contentor de apontadores para registos 18 9
Índices secundários Índices secundários têm de ser densos (porquê?) Também têm que ser mantidos actualizados Menos eficiente que um índice primário cada registo pode implicar o acesso a um bloco diferente 19 Bases de Dados Índices em SQL 10
Definição de índices em SQL Criação de um índice create index index_name on table_name(column_list) exemplo create index branch_index on branch(branch_name) Para eliminar o índice: drop index branch_index 21 Índices com múltiplas chaves de procura Certas perguntas exigem múltiplos índices select account_number from account where branch_name = Perryridge and balance = 1000 estratégias possíveis usar índice para branch_name e testar valor de balance usar índice para balance e testar valor de branch_name usar índice para branch_name e outro para balance e intersectar os resultados 22 11
Chaves de procura compostas Chaves de procura compostas chaves de procura com mais de um atributo p.ex. create index branch_balance_index on account (branch_name, balance) São pesquisados por ordem lexicográfica (branch 1, balance 1 ) < (branch 2, balance 2 ) se (branch 1 < branch 2 ) ou (branch 1 = branch 2 ) e (balance 1 < balance 2 ) 23 Chaves de procura compostas where branch_name = "Perryridge" and balance = 1000 Um índice composto pode ser usado para obter os registos que satisfazem as duas condições mais eficiente do que usar índices separados também é eficiente noutros casos, p.ex. where branch_name = "Perryridge" and balance > 1000 não é eficiente em where branch_name > "Perryridge" and balance = 1000 obtém registos que satisfazem a primeira mas não a segunda condição 24 12
Índices Como é que os índices são implementados? Há dois tipos básicos de índices índices ordenados (p.ex. árvore B + ) valores da chave de procura armazenados por ordem índices do tipo hash valores da chave de procura distribuídos uniformemente por vários "contentores" (buckets) de acordo com uma função de hash 25 Bases de Dados Índices em árvore B + 13
Árvore B + exemplo 1 árvore B + com n=3 27 Árvore B + exemplo 2 árvore B + com n=5 28 14
Árvore B + nós Cada nó da árvore contém K i são valores ordenados K 1 < K 2 < K 3 <... < K n 1 P i são apontadores apontadores para outros nós (se o nó não é folha) ou apontadores para registos (se é folha) 29 Árvore B + nós folha Se o nó é folha P i aponta para um registo com valor K i ou P i aponta para um contentor de registos com K i necessário se o valor aparece em vários registos P n aponta para a folha seguinte (mesmo nível) 30 15
Árvore B + nós não-folha Se o nó não é folha forma um índice esparso multi-nível para as folhas todas as chaves na sub-árvore de P i (esquerda) são menores que K i em geral, todas as chaves na sub-árvore de P i são K i 1 e < K i as chaves K n 1 estão na sub-árvore apontada por P n 31 Árvore B + propriedades Todos os caminhos da raiz a qualquer folha percorrem o mesmo número de nós Cada nó tem entre n/2 e n descendentes excepto a raiz, que pode ter menos Cada folha tem n apontadores e (n-1) valores apenas alguns podem estar preenchidos regra geral, tem de ter no mínimo (n-1)/2 valores Casos especiais: se a raiz não é uma folha, tem pelo menos 2 descendentes se a raiz é folha (e a árvore só tem esse nó) pode ter entre 0 e (n 1) valores 32 16
Árvore B + vantagens Com ligações feitas por apontadores, não é necessário ter os blocos fisicamente juntos no disco Partindo da raiz, é possível chegar rapidamente a qualquer folha, mesmo que o número de folhas seja muito grande Se houver inserções ou remoções de registos na tabela, o índice pode ser actualizado apenas com pequenas alterações locais 33 Procura em árvores B + Encontrar todos os registos com chave de procura k 1. começa pela raiz a) procurar na raiz o menor valor K i tal que K i > k b) se existir, seguir P i (esquerda) para o nó descendente c) senão, seguir P n (último da direita) 2. repetir o passo anterior até chegar a uma folha 3. assim que chegamos a uma folha a) procurar na folha o valor K i tal que K i = k b) se existir, seguir P i para o registo c) senão, é porque o registo não existe 34 17
Procura em árvores B + Se houver K valores da chave de procura na árvore, nenhum caminho é mais comprido do que log n/2 (K) Geralmente um nó é do tamanho de um bloco, tipicamente 4 KB se cada entrada no índice (valor, apontador) ocupa 40 bytes, escolhe-se n 100 com 1 milhão de valores de chave e n=100 acedese a apenas log 50 (1 000 000) = 4 nós se a árvore fosse binária seriam precisos 20 nós cada nó exige um acesso ao disco (~20ms) 35 Modificações em árvores B + As modificações em árvores B+ seguem os seguintes passos: 1. pesquisar o valor pretendido na árvore, desde a raíz até chegar à folha respectiva (top-down) 2. fazer as alterações pretendidas ao nível das folhas 3. repercutir os efeitos de forma bottom-up, isto é, depois de alterar nós a um nível, verificar se o nó ascendente fica coerente, senão propagar os efeitos recursivamente (até à raiz, se necessário) 36 18
Propriedades Propriedades que devem ser sempre mantidas: A. à esquerda de um valor está uma sub-árvore com valores sempre menores B. à direita de um valor está uma sub-árvore com valores maiores ou iguais C. em nós que não são folha, cada valor preenchido corresponde ao menor valor da sub-árvore direita 37 Inserção em árvores B + Inserção procurar a folha em que esteja presente a chave dada se existir, adicionar registo à tabela e inserir apontador no contentor senão, adicionar registo e criar novo contentor inserir a entrada (valor, apontador) na folha se a folha ultrapassar o máximo de n 1 valores separar os n valores em 2 nós 38 19
Inserção em árvores B + Separação de n valores em 2 nós deixar os primeiros n/2 valores no nó original, o resto passa um segundo, novo nó inserir a entrada (k,p) no nó ascendente, em que k é a menor chave do novo nó p é um apontador para o novo nó se o nó ascendente excedeu o tamanho máximo, parti-lo segundo o mesmo procedimento se a divisão se propagar até à raiz a raiz é partida em 2 nós é criada uma nova raiz como ascendente destes 2 nós 39 Inserção em árvores B + exemplo 40 20
Exercício Considere uma árvore B + com n=3 a) A partir de uma árvore vazia, desenhe a árvore após a inserção sucessiva dos seguintes valores: 1, 9, 5, 3, 6, 8, 4 41 Exercício a) 5 9 6 1 1 1 3 5 6 9 5 9 9 1 9 5 8 9 8 1 5 9 1 3 5 6 8 9 3 5 9 8 4 1 3 5 9 4 5 9 1 3 4 5 6 8 9 42 21
Bases de Dados Índices do tipo hash Índices do tipo hash Um contentor armazena um conjunto de entradas valor, apontador(es) tipicamente um contentor ocupa um bloco em disco Função de hash recebe como parâmetro um valor e determina o contentor mas no mesmo contentor pode haver diferentes valores Dentro dos contentores, as entradas são pesquisadas sequencialmente 44 22
Índices do tipo hash exemplo 45 Funções de hash Tipicamente, as funções de hash trabalham com a representação binária do valor da chave de procura p.ex. somar todos os caracteres da string e fazer o resto da divisão pelo número de contentores A função de hash ideal devia ser uniforme e aleatória todos os contentores deviam ficar com (aproximadamente) o mesmo número de entradas 46 23
Overflow de contentores Pode ocorrer overflow de contentores devido a número insuficiente de contentores muitos registos com a mesma chave de procura função de hash não uniforme A hipótese de overflow nunca pode ser eliminada depende dos dados é normalmente resolvida com contentores extra 47 Overflow de contentores Encadeamento de contentores 48 24
Índices do tipo hash Os índices em árvore B + são normalmente usados para índices primários Os índices do tipo hash são normalmente usados para índices secundários Porquê?... 49 Índices do tipo hash Problemas na utilização de índices do tipo hash se o número de contentores for pequeno, poderá ser necessário contentores extra (overflow) se o número de contentores for demasiado grande, haverá desperdício de espaço Os sistemas actuais usam hashing dinâmico, em que o número de contentores varia dinamicamente exige mudar a função de hash e reorganizar o índice quando o número de contentores se altera 50 25
Bases de Dados Índices do tipo bitmap Índices do tipo bitmap Usados para consulta eficiente sobre várias chaves de pesquisa Registos numa relação assumem-se numerados sequencialmente deve ser possível obter rapidamente o registo n Funciona sobre atributos que tomam um conjunto reduzido de valores distintos p.ex. país também é possível decompor atributos em níveis p.ex. salário decomposto em: 0-500, 500-1000, 1000-2000, 2000-3000, 3000-infinito Um bitmap é um array de bits 52 26
Índices do tipo bitmap Um índice bitmap sobre um atributo é um bitmap para cada valor possível do atributo cada bitmap tem tantos bits como registos 53 Índices do tipo bitmap Exemplo de consulta: σ gender = f Λ income_level = L2 (r) Resposta obtida com operação sobre bitmaps 01101 and 01000 = 01000 há apenas um registo que obedece à condição identificação e contagem dos registos é imediata Outras consultas também podem ser feitas com operações sobre bitmaps intersecção (and), união (or), complemento (not) 54 27