PostgreSQL Índices Nuno Campos N.º 51431 Índice Introdução Tipos de Índices – – – – 2 B-Tree R-Tree Hash GiST Classes de Operadores Índices Compostos Índices Únicos Índices em Expressões Índices Parciais Examinar a Utilização do Índice Nuno Campos - N.º 51431 Introdução PostgreSQL actualiza índice quando uma tabela é modificada Trabalho extra para operações de manipulação de dados Índices não essenciais ou não utilizados devem ser removidos postgresql-8.1.0\src\ – \backend\access\ - Métodos de acesso aos dados – 3 \gist\ – definição de métodos de acesso \hash\ – métodos dos índices hash \index\ – usado por todos os tipos de índices \nbtree\ – algoritmo Lehman and Yao's de gestão de b+tree \rtree\ - métodos usados em r-tree’s \backend\catalog – Rotinas de criação e manipulação de índices Nuno Campos - N.º 51431 Tipos de Índices (B-Tree) B+Tree Utiliza-se em igualdades e intervalos Usa Algoritmos de Lehman e Yao com alterações: – – – 4 Chaves de tamanho variável Trinco nas leituras a nível da página Ligação entre nós folhas é bidireccional Nuno Campos - N.º 51431 Tipos de Índices (R-Tree) Divide espaço com caixas aninhadas hierarquicamente (pode haver sobreposição) Árvore com nós folhas à mesma profundidade Adequados para consultas a dados espaciais Optimizador considera o uso de uma R-Tree para comparações envolvendo: – – – – – – – 5 << (Está à esquerda?) &< (Não se estende à direita de?) &> (Não se estende à esquerda de?) >> (Está à direita?) @ (Está contido ou sobre?) ~= (O mesmo que?) && (Sobrepõem-se?) Nuno Campos - N.º 51431 Tipos de Índices (Hash) Algoritmo de Hashing Linear desenvolvido por W. Litwin Optimizador considera o uso de Hash para comparações de igualdades. No PostgreSQL, os índices Hash: – – – 6 Desempenho semelhante a B-Trees Tamanho e tempo de construção piores Utilização desencorajada. Nuno Campos - N.º 51431 Tipos de Índices (GiST) 7 GiST – Generalized Search Tree Estrutura em árvore Implementação de esquemas de índices Desenvolvimento de tipos de dados próprios Nuno Campos - N.º 51431 Classes de Operadores 8 Pode ser especificada para cada coluna do índice Identifica os operadores a serem usados pelo índice para cada coluna Cada classe inclui funções para o tipo respectivo Usualmente a classe de operadores padrão é suficiente Nuno Campos - N.º 51431 Índices Compostos Índice com mais de um atributo SELECT nome FROM teste2 WHERE principal = constante AND secundario = constante; CREATE INDEX idx_teste2_princ_sec ON teste2 (principal, secundario); PostgreSQL – – 9 B-Tree, GiST src\include\pg_config_manual.h (INDEX_MAX_KEYS 32) Nuno Campos - N.º 51431 Índices Únicos Obrigam à unicidade do valor de uma coluna CREATE UNIQUE INDEX nome … Permite interromper a procura de valores múltiplos quando estes não existem PostgreSQL – – Apenas índices B-Tree podem ser declarados únicos Índice criado automáticamente quando é definida: 10 Uma restrição de unicidade Uma chave primária Nuno Campos - N.º 51431 Índices em Expressões Índices sobre expressões em vez de colunas Útil para acesso a tabelas resultantes de cálculos CREATE INDEX idx_teste1_lower_col1 ON teste1 (lower(col1)); Dispendioso manter expressões de índice porque – – 11 Expressão computada para cada tuplo inserido Expressão computada para cada tuplo actualizado Nuno Campos - N.º 51431 Índices parciais Índice construído sobre subconjunto da tabela – 12 Definido por expressão condicional – predicado Índice contém entradas para linhas que satisfazem predicado Evita indexar valores frequentes Reduz tamanho do índice Acelera consultas e actualizações Nuno Campos - N.º 51431 Examinar a utilização do índice ANALYZE – – EXPLAIN – – 13 Recolhe estatísticas sobre a distribuição de valores nas tabelas Necessária para estimar tuplos devolvidos Exame de utilização de um índice Devem ser usados dados reais Nuno Campos - N.º 51431 Referências 14 Efficient Locking for Concurrent Operations on BTrees, Lehman e Yao, 1981 Database Systems and Concepts, Silbertchatz, Korth and Sudarshan, 5ª edição, 2005 http://www.postgresql.org http://www.bluerwhite.org/btree/ http://nlhgis.nlh.no/gis/applets/rtree2/jdk1.1/help.html http://en.wikipedia.org/wiki/Hash_function http://www.mcs.vuw.ac.nz/technical/software/Postgre SQL/gist.html Nuno Campos - N.º 51431 Exemplo B+Tree 15 Nuno Campos - N.º 51431 Exemplo R-Tree 16 Devolver as imagens com x < 5 e y <10 Nuno Campos - N.º 51431 Exemplo Hashing Linear (1) Inserir 10 tuplos com valores de Hash: – – 0011, 0010, 0100, 0001, 1000, 1110, 0101, 1010, 0111, 1100 Factor de carregamento (fc) – máximo 0,70 n – apontador para bucket a dividir, quando chega à posição 3, volta ao inicio 0 17 1 2 3 Inserir cinco valores (fc = 5/8 = 0,625) 0100 1000 0 0001 0010 0011 1 2 3 Nuno Campos - N.º 51431 Exemplo Hashing Linear (2) Quando inserimos o 6º valor 0100 1000 0 18 0001 1 0010 1110 2 0011 3 Fc = 6/8 = 0,75 divisão de bucket n = 0 1000 0001 0010 1110 0 1 2 Fc = 6/10 = 0,6; n = 1 0011 0100 3 4 Nuno Campos - N.º 51431 Exemplo Hashing Linear (3) Quando inserimos 0101, fc = 7/10 = 0,7 1000 0 0001 0101 1 0010 1110 2 0011 0100 3 4 Quando inserimos 1010, fc = 8/10 = 0,8 1000 0001 0101 0010 1110 0011 0100 overflow 19 1010 Nuno Campos - N.º 51431 Exemplo Hashing Linear (4) Divide n = 1; fc = 8/12 = 0,66 1000 0 0001 1 0010 1110 2 0011 3 0100 0101 4 5 1010 overflow Inserir 0111; fc = 9/12 = 0,75; ocorre divisão para n = 2 1000 20 0 0001 1 0010 1010 2 0011 0111 3 0100 4 0101 5 1110 6 Nuno Campos - N.º 51431