Índices
- Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.
- Após o desenvolvimento inicial com a confecção do:
- Projeto Entidade Relacionamento (DER)
- Refinamento do esquema (Normalização)
- Definição de visões e relatórios
- podemos definir o modelo conceitual e externo para o BD
- Na sequência:
- Seleciona-se os índices
- Decide-se os agrupamento s
- E (se necessário) refinase os modelos conceitual e externo para atingir metas de desempenho.
- Função do índice:
- No contexto do livro, serve para procurar um determinado assunto identificando o volume ou página.
- No contexto da estrutura de dados, o índice é uma referência associada a uma chave, que é utilizada para fins de otimização, permitindo uma localização mais rápida de um registro quando efetuada uma consulta.
- No contexto de banco de dados, um índice tem a função de permitir que os registros com dados sejam encontrados com rapidez. Também oferecem um acesso alternativo aos registros sem que a posição física seja alterada
- Exemplo:
- Cadastro de Clientes
- Chave: CPF
- Se precisarmos de uma lista de clientes por ordem de CEP, é possível indexar e listar dessa maneira
- Pode ser necessário também:
- Lista por ordem de Nome
- Lista por ordem de Estado Civil
- Lista por ordem de Status
- Lista por ordem de Data de Nascimento
- Lista por ordem de Bairr
- Lista por ordem de Data do Cadastro
- Lista por ordem de Email
- Efetivamente, os índices são um modo comum de melhorar o desempenho do banco de dados pois permitem ao servidor de banco de dados encontrar e trazer linhas específicas muito mais rápido do que faria sem o índice
- Entretanto, os índices também produzem trabalho adicional para o sistema de banco de dados como um todo devendo, portanto, serem utilizados com sensatez.
- O processo pode ser iniciado pela compreensão do ambiente (negócio) onde será implantando e definir:
- As consultas mais importantes e a frequência com que aparecem
- As atualizações mais relevantes a frequência com que podem ser feitas
- O desempenho desejado para estas consultas e atualizações.
- Um índice pode ser:
- simples: quando formado por apenas uma coluna
- composto: referenciado por mais de uma coluna
- interno: a chave está contida dentro da tabela
- externo: quando existe uma tabela de chaves separada que associa ponteiros à registros de uma tabela
- Preocupações:
- Que índices deve-se criar?
- Quais relações devem ter índices?
- Qual(is) campo(s) devem estar na chave de pesquisa?
- Deve-se construir vários índices?
- Que índices deve-se criar?
- Devemos fazer mudanças no esquema conceitual?
- Considerar esquemas normalizados alternativos?
- Há várias escolhas na decomposição em formas normais, etc
- Devemos “desfazer” alguns passos da decomposição e ficar com uma forma normal mais baixa?
- Desnormalização?
- Considerações para Seleção de Índice:
- É necessária a criação do índice?
- Escolha da chave de busca
- Utilizar múltiplos atributos na chave de busca
- É necessário o agrupamento?
- Devo usar hash ou árvore?
- Hash:Permite inserção de novos elementos mas ocupa maior quantidade de espaço
- Árvore: No caso de árvore binária, da busca é muito eficiente mas a tabela deve estar em ordem crescente ou decrescente.
- Balanceamento do custo de manutenção do índice.
- Os campos utilizados na definição dos índices denominam-se campos de indexação
- Os índices não contém dados propriamente ditos e sim valor de campo de indexação e ponteiros que direcionam para o registro adequado dentro da tabela
- Inserindo ou excluindo o registro, força também uma alteração nos índices
- Em alguns sistemas, os índices encontram-se separados do arquivo de dados
Exemplos
MySQL
- No MySQL, como em qualquer sistema, índices, estes são utilizados para encontrar registros com um valor específico de uma coluna rapidamente
- Sem um índice o MySQL tem de iniciar com o primeiro registro e depois ler através de toda a tabela até que ele encontre os registros relevantes
- Quanto maior a tabela, maior será o custo
- Se a tabela possui um índice para as colunas em questão, o MySQL pode rapidamente obter uma posição para procurar no meio do arquivo de dados sem ter que varrer todos os registros. Se uma tabela possui 1000 registros, isto é pelo menos 100 vezes mais rápido do que ler todos os registros sequencialmente
- Note que se você precisar acessar quase todos os 1000 registros, seria mais rápido acessá-los sequencialmente porque evitaria requisições ao disco.
- Todos os índices do MySQL (PRIMARY, UNIQUE e INDEX) são armazenados em árvores BTree
- Strings são automaticamente compactadas nos espaços finais e prefixados.
Access
- Na medida em que consultas de certos dados vão sendo realizadas, registros sendo classificados por um campo específico, que com frequência é utilizado como referência, torna-se necessário utilizá-lo como índice em uma tabela
- O Microsoft Office Acces procura o local dos dados através do índice e em alguns casos como em chaves primárias esta indexação é feita de maneira automática visando melhorar o desempenho do banco de dados. No entanto, alguns casos é provável que a definição do índice deverá ser feita manualmente
- O índice auxilia o MS Office Access a localizar e classicar os registros com mais rapidez. Tal índice armazena o local dos registros com base no(s) campo(s) escolhido(s) para ser(em) indexado(s). Após obter a localização do índice, os dados poderão ser recuperados.
- A criação de índices pode ser baseada em um único campo ou em vários. Os campos mais propensos à indexação são aqueles citados em várias pesquisas, campos associados a campos de outras tabelas.
- Se de uma forma os índices agilizam as pesquisas e consultas, de outra pode comprometer o desempenho na medida em que dados vão sendo criados ou atualizados. Quando os dados são inseridos em uma tabela que contém um ou mais campos indexados, o Access atualiza os índices cada vez que um registro é adicionado ou modificado. A adição de registros através de uma consulta acréscimo ou do acréscimo de registros importados provavelmente também será mais lenta se a tabela de destino contiver índices.
- Para a indexação de um campo, alguns critérios deverão ser levados em consideração e as condições abaixo devem aplicáveis:
- O tipo de dado do campo pode ser Texto, Memorando, Número, Data/Hora, Auto numeração, Moeda, Sim/Não ou Hiperlink
- Pode-se procurar por valores armazenados no campo.
- É possível classificar com base nos valores dos campos.
- Provê o armazenamento de diversos valores diferentes no campo. Se muitos dos valores no campo forem iguais, provavelmente o índice não poderá acelerar significativamente as consultas.
Oracle
- Oferece vários tipos de índices disponibilizando boas alternativas para todos os tipos de sistemas e processamentos no banco de dados
- Índices B-Trees: Índice padrão que o Oracle tem usado desde as primeiras versões. A fim de gerenciar corretamente os blocos, o Oracle controla o alocamento dos ponteiros dentro de cada bloco dos dados
- Uma “árvore de blocos” (analogia à forma com a qual o Oracle aloca os blocos de dados) cresce através da inserção de linhas na tabela. Quando um bloco é preenchido, o mesmo “racha”, a fim de criar novos “galhos”, ou se preferir, blocos de dados. É ai que entra o índice do tipo B-Tree, controlando ponteiros dentro dos blocos de dados.
- Um bloco de índice do Oracle pode conter dois tipos de ponteiros:
- Ponteiro para um outro nó de blocos de dados de índices
- Ponteiros para linhas específicas da tabelas ou ROWID (endereço físico do registro , informando em qual arquivo e setor o dado se encontra).
- Índice Bitmapped:
- Lista dos valores distintos da coluna chave, onde cada um desses valores recebe um bitmap contendo um bit para cada linha da tabela
- O bit ligado indica que a linha específica contém o valor da coluna chave
- Sua estrutura, então, é apropriada para colunas chaves com pequena cardinalidade e com grande quantidade de linhas porém, a modificação dos valores da coluna chave revela o ponto fraco desse índice, uma vez que essa operação leva ao reajuste de grandes porções do bitmap e ao conseqüente bloqueio – lock – de uma grande quantidade de linhas da tabela, comprometendo a concorrência do ambiente
- Índice Baseado em Função:
- O algoritmo do otimizador dos SGBD comerciais desconsidera, na montagem do plano de acesso, o índice associado a uma coluna chave referenciada em uma função como, por exemplo, TO_CHAR ou TO_NUMBER
- Para suplantar essa limitação, os índices B-tree ou Bitmapped podem ser criados com a inclusão de uma função – padrão SQL ou construída pelo desenvolvedor – ou mesmo uma expressão aritmética, conforme a sentença de criação do índice necessário.
PostgreSQL
- B-Tree:
- Índices baseados em árvores B pois este padrão facilita consultas utilizando a igualdade de valores ou intervalos de valores (>= > = < <=).
- Hash:
- Índices que organizam um BD baseando-se em funções. Funciona em comparações de igualdade (=)
- Apresenta resultados melhores que as B-tree mas possuem a limitação acima. Demandam a reorganização manual de índices após falhas no BD e muitos desencorajam seu uso
- GiST - Índices GiST (Generalized Search Tree) oferecem uma infra-estrutura sobre a qual podem ser implementadas consultas
- Geram uma árvore de pesquisa balanceada versátil similar a uma árvore B que pode ser utilizada com estruturas de dados definidas pelo usuário e em implementações diversas como em busca em texto
- Internamente é composta por nós que apresentam pares (Valor, ponteiro para dado indexado ou para outro nó).
- GIN - Índices GIN(Generalized Inverted Index) são estruturas invertidas que permitem acesso a dados com mais de uma chave, como arrays
- Composto por uma lista de registros tipo (chave, lista de linhas que contém o valor da chave). Internamente cada índice GIN contém uma árvore B com base no valor da chave indexada, cujas folhas apontam para os valores das linhas relacionadas à chave.
Questões
1. Qual a diferença entre índices Binary Tree e índices comuns?
- Caetano
2. O que é balanceamento de índices?
- Fernando
3. O que é e como funciona um IAM (Index allocation map)?
- Hiago
4. Como funciona a questáo índices de hash (hash indexes)?
- Igor
5. Como os índices sáo alocados nas tabelas?
- Lucas
6. Quais técnicas devemos considerar para Indexação?
- Yassushi
· Tempo de Acesso: O tempo para encontrar um item de dados particular.
· Tempo de Inserção: O tempo para inserir um novo item de dado. Isto inclui o tempo para encontrar o lugar correto para inserir o novo item de dado assim como o tempo para atualizar a estrutura do índice.
· Tempo de Remoção: O tempo para remover um item de dado. Isto inclui o tempo para encontrar o item a ser removido assim como para atualizar a estrutura do índice.
· Espaço Extra: O espaço adicional ocupado por uma estrutura de índice. Se o espaço adicional é pequeno, normalmente é vantajoso sacrificar esse espaço em benefício de um melhor desempenho.


