Oracle índices

Oracle – Entendendo um pouco mais sobre índices

Os índices certamente não resolverão todos os seus problemas de desempenho, mas se bem utilizados são de grande ajuda para a busca de dados de forma eficiente. Aliás criar índices para variadas colunas, sem visualizar a Clausula WHERE e a Seletividade não é uma boa tática, mas isso é tema para outros posts. Vamos tentar quebrar alguns paradigmas sobre índices, são eles:

a)      Com o tempo, índices se tornam desbalanceados e, com isso, requerem uma reconstrução (rebuild) para um bom desempenho

b)      Índices com valores sempre crescente ou monôtonico (nunca diminuem ex.: Sequences) tendem a piorar sua performance com o passar do tempo, pois precisam de “re-balanceamento”

Um pouco da estrutura de um índice B*Tree:

  • Leaf Nodes: contêm entradas que se referem diretamente as linhas das tabelas;
  • Branch Nodes: contêm entradas que se referem a “Leaf Nodes”; e
  • Um único Root Node: que é um “Ramo” , o topo da estrutura da árvore

O número de entradas em um “Branch Block” é determinado em parte pelo DB_BLOCK_SIZE, bem como o comprimento dos valores dos dados. Cada entrada em um “Leaf Block” consiste em linhas com 2 colunas. A primeira coluna é o valor do dado propriamente dito e a segunda coluna é o ROWID.

O ROWID (“endereço” físico do dado) que é uma pseudo-coluna de cada tabela de seu database e contêm as seguintes informações:

Partes do ROWID Significado
AAADVH (até 6º caracter) Segmento
AAE (3 caracteres seqüentes) Datafile@tablespace
AAAADk (6 caracteres sequentes)  Block@datafile
AAA (3 últimos caracteres) Número de linhas no bloco

 Há diversos tipos de índices: Bitmap, Reverse Keys, Function Based Index, Index Descending … . Cada um desses tem características diferentes e cada um deles apresenta ganhos de desempenho com um tipo de acesso aos dados. Já perceberam que para fazer um post completo sobre índices seria uma leitura muito, muito, muito extensa e provavelmente ainda faltaria muitas coisas. Mas vamos continuar com os pontos mais importantes:

O Blevel é considerado por alguns DBAs como um balizador para um Index Rebuild! O Blevel é o número de níveis que o índice tem gerado. Mesmo para índices muito grande, ele dificilmente será superior a 4. Cada Blevel representa um I/O adicional que deve ser realizado na árvore do índice!

Voltando ao assunto sobre o Rebuild relacionado ao Blevel, se você tem um índice com crescimento monotônico (uma chave que é uma sequência que só aumenta e nunca diminui), e as entradas são deletadas, porém nunca são re-utilizadas, um rebuild PODE SER útil e o Blevel aqui poderia ser um indicador, mas a análise não pode basear-se apenas nesse número. Tomas Kytes tem grandes discussões sobre esse tema, uma delas, pode ser acompanhada por: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2913600659112#43555424746793.

A perda de performance, não ocorre porque o índice fica “desbalanceado”, pois o balanceamento é realizado conforme a inserção de dados. A perda de performance, pode ocorrer porque o índice se torna mais espaçado, com mais blocos livres. Na maioria das vezes esse problema ocorre devido a exclusões de linhas o que resulta em entradas de índices não re-utilizadas.

Algumas notas da própria Oracle com o objetivo de encontrarmos quais indices devem ser rebuildados(Script: Lists All Indexes that Benefit from a Rebuild [ID 122008.1] ), ( Index Rebuild, the Need vs the Implications [ID 989093.1] ) e ( Script to investigate a b-tree index structure [ID 989186.1] ).

A solução após as devidas análises e caso chegue-se a conclusão de que a performance (diminuição de blocos lidos em SQLs) ou o ganho em termos de espaço em disco irão compensar a janela de manutenção para o rebuild …. mãos a obra!!!!

Bom artigos sobre rebuild podem ser encontrados em www.dbazine.com e procurem artigos de performance sobre o assunto de autoria de Jonathan Lewis, alguns deles: Unbalaced Indexes? ( www.dbazine.com/jlewis13.shtml ) e When should you rebuild an index? ( www.dbazine.com/jlewis14.shtml ).

Índice é um assunto muito interessante e muito vasto! Por isso e para falarmos de outras métricas interessantes que influenciam o otimizador a utilizar ou não um determinado índice, precisaremos de muitos e muitos posts. Ao longo do post, espero ter quebrado os dois mitos citado no início desse. 

Abraços espero ter ajudado a entenderem um pouco sobre índices. 

By José Eduardo Fiamengui Júnior

Sobre oradeep

José Eduardo Fiamengui Júnior Graduação: Tecnologia em Informática pela Universidade Estadual de Campinas (Unicamp) Pós-Graduação: Administração em Banco de Dados Oracle pelo Instituto Brasileiro de Tecnologia Avançada (IBTA) Mba em Gestão Estratégica em TI pela FGV OCE Certified ITIL Certified Empresa Atual: Dba Oracle e Performance Specialist na Ccee Empresa Atual: Instrutor Oracle IBTA
Esta entrada foi publicada em Oracle. ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s