Estabelecendo uma estratégia para o uso efetivo de índices

 

por João Marcelo Borovina Josko


Os Sistemas Gerenciadores de Banco de Dados - SGBD - possuem estruturas que propiciam a localização e o acesso mais rápido a dados específicos dentro de uma tabela e, adicionalmente, contribuem nas consultas envolvendo ordenações, agrupamentos e junções. Essas estruturas são notoriamente conhecidas por índices.


Em contrapartida aos benefícios proporcionados nas buscas de dados, essas estruturas consomem espaço de armazenamento e geram impactos negativos em termos de desempenho e concorrência nas operações de atualização - update, delete e insert - das tabelas a qual estão associados.

Assim, os índices não podem ser criados aleatoriamente, sendo suas características e quantidade dependentes das expectativas dos usuários, do espaço de armazenamento disponível, do overhead da manutenção e administração e, principalmente, da finalidade do banco de dados; apoio a processos operacionais ou a processos de Business Intelligence. Tais pontos são considerados pela estratégia de indexação.

A Estratégia

Uma estratégia de indexação é um método de determinação das características de um índice de forma que esse possa incrementar o desempenho das consultas – escolhidas por sua criticidade ou volume de execuções –, mantendo o equilíbrio como outras operações realizadas sobre um banco de dados. A estratégia é formada a partir de componentes representados a seguir.

sql-04-03-2008pic01.JPG
Figura 1 – Componentes da Estratégia de Indexação.

Existem duas abordagens para a criação de índices que são utilizados de maneira iterativa e conjunta; a abordagem proativa e a reativa. Na primeira, a coluna – ou colunas –candidata a formarem um índice é identificada por meio da análise prévia das consultas a serem aplicadas sobre um banco de dados, análise essa que pode utilizar a técnica de Análise de Caminhos de Acessos. Já a abordagem reativa, presente nos procedimentos de monitoração do banco de dados, consiste em observar os índices em operação no ambiente produtivo para, baseado no comportamento, optar por ajustes que incrementem sua eficiência ou eliminação definitiva.

A abordagem possibilita o delineamento das características do índice a ser criado pelo entendimento de como o banco de dado será exercitado. Como isso pode ocorrer de diferentes maneiras, os SGBD disponibilizam tipos de índices com capacidades distintas e o conhecimento desses é valioso para concluir a estratégia. A seguir, são descritos, de forma geral, algumas das opções principais disponibilizadas pelo Oracle 10g.

Índice de Árvore Binária

O índice B-Tree possui uma estrutura hierárquica que armazena ponteiros para as linhas de uma tabela – ver figura 2 –, sendo indicado para colunas chaves – coluna que faz parte de um índice – cujos valores apresentem muita distinção como, por exemplo, aqueles encontrados em uma coluna que será chave primária. Por outro lado, seu uso proporciona desempenho reduzido – se houver – para colunas com pouca diferença de valores como, por exemplo, nos casos de Unidade de Federação ou Sexo.

sql-04-03-2008pic02.JPG
Figura 2 – Estrutura do índice B-Tree (Adaptado da Oracle)

Índice Bitmapped

O conceito deste índice é de uma lista dos valores distintos da coluna chave, onde cada 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, conforme ilustrado na figura 3.

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.

sql-04-03-2008pic03.JPG
Figura 3 – Estrutura do índice Bitmapped (Adaptado da Oracle)

Í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 abaixo.

Conclusão

A eficiência e eficácia de um índice é uma questão muito volátil, pois essa questão depende da manutenção e monitoração mais ágeis dos bancos de dados de forma atender adequadamente as constantes evoluções no negócio. Esse cenário, inclusive, constitui um dos grandes desafios das áreas de TI atualmente, senão o maior.


A importância dos índices, dentro do contexto de um banco de dados e dos sistemas de informação que o utilizam, requer da organização o emprego de um método de trabalho para usufruir, o mais plenamente possível, dos benefícios proporcionados por esse recurso. Esse método não representa uma atividade isolada e realizada esporadicamente, mas sim deve estar contido nos processos de Desenvolvimento e Administração de sistemas de informação da organização, formalizando sua necessidade em qualquer atividade rotineira ou cronograma de projeto.

Referências bibliográficas

JOSKO, João Marcelo B. “Adequando transações e o modelo físico de dados por meio da análise dos caminhos de acesso”, em //www.devmedia.com.br/articles/viewcomp.asp?comp=7873, acessado em 29/02/2008

JOSKO, João Marcelo B. “Pensando o desempenho no data warehouse”, em //www.devmedia.com.br/articles/viewcomp.asp?comp=6940, acessado em 29/02/2008

ORACLE. “Oracle database administrator’s guide 10g”. 2003. 1078p.