Anterior  Próximo

Navegação:  e-Forms NFC-e 4.8.1.0 > Manual de Manutenção de Banco de Dados e-Forms > Manual de Manutenção de Banco de Dados e-Forms - Oracle > Guia de Configurações da Rotina de Manutenção de Banco de Dados > Índices

Fragmentação dos índices

Para verificar a fragmentação dos índices utilizar o script em anexo. O script pode ser executado em produção porém requer permissões especiais. Os valores dos índices listados precisam ser analisados para determinar se o índice precisa ser reconstruído.

Há dois bons indicadores que ajudam a determinar se o índice precisa ser reconstruído.

1. A altura do índice: caso tenha valor maior que 4, deve-se reconstruir o índice - ver a coluna (Blevel).

2. As linhas de folhas excluídas devem ser inferior a 20% - ver a coluna (Deleted Entries).

Se os valores apresentados se enquadrarem nas regras acima descritas, então isso indica que o índice precisa ser reconstruído, isto pode ser realizado pelo comando ALTER INDEX REBUILD | REBUILD ONLINE.

clip1244Importante:

Não é recomendado, executar este comando durante o horário de produção. Pois durante a criação, o índice utiliza a tabela como fonte de dados e para executar essa atividade, o SGBD Oracle precisa colocar um “LOCK” na tabela envolvida. O índice também não estará disponível durante a criação.

 

Para a maioria dos índices, o valor da altura será baixo, ou seja, 1 ou 2. Um índice com altura superior a 4 pode indicar a necessidade de reconstrução, pois esse valor indica uma estrutura de árvore que está inclinada. A inclinação de uma árvore pode levar o banco de dados a bloquear linhas desnecessariamente enquanto lê informações do índice.

O script abaixo exibe os dados dos índices que precisam de atenção. Os valores dos índices listados precisam ser analisados para determinar se o índice precisa ser reconstruído.

hmtoggle_plus1Script de Fragmentação de Índices

/*

TABELAS CRÍTICAS DO CONNECTOR, COM GRANDE VOLUME DE DADOS E QUE SÃO UTILIZADAS DURANTE O PROCESSAMENTO

- TBLOGDOCUMENT

- TBPROCESS

- TBPROCESSDATA

- TBLOGODCUMENTSTATUS

- TBLOGDOCMESSAGE

- TBSTATISTICS

- TBLOT

- TBLOTS

- TBDATABASEINPUT

 

Para verificar quais índices precisam ser reconstruidos rodar o script abaixo, antes de executar deve-se alterar o nome do owner dos objetos,

para isso substitua no script o valor <OWNER_NAME> pelo nome do usuário do connector.

Esse script se baseia em três indicadores para definir se um índice precisa ou não ser reconstruido "Deleted Entries", "Blevel", "Distinctiveness",

os valores desses indicadores vão sugerir a necessidade da reindexação.

Após a execução os índices fragmentados serão listados.

*/

------- RODAR PREFERENCIALMENTE DENTRO DE UMA JANELA DE MANUTENÇÃO ---------------

set serveroutput on

set verify off

declare

 c_name        INTEGER;

 ignore        INTEGER;

 height        index_stats.height%TYPE := 0;

 lf_rows       index_stats.lf_rows%TYPE := 0;

 del_lf_rows   index_stats.del_lf_rows%TYPE := 0;

 distinct_keys index_stats.distinct_keys%TYPE := 0;

 cursor c_indx is select owner, table_name, index_name from dba_indexes

   where owner like upper('<OWNER_NAME>');

 

begin

 dbms_output.enable (1000000);

 dbms_output.put_line ('Owner           Index Name                              % Deleted Entries Blevel Distinctiveness');

 dbms_output.put_line ('————— ————————————— —————– —— —————');

 c_name := DBMS_SQL.OPEN_CURSOR;

 

 for r_indx in c_indx loop

   DBMS_SQL.PARSE(c_name,'analyze index ' || r_indx.owner || '.' ||

   r_indx.index_name || ' validate structure',DBMS_SQL.NATIVE);

   ignore := DBMS_SQL.EXECUTE(c_name);

 

   select HEIGHT, decode (LF_ROWS,0,1,LF_ROWS), DEL_LF_ROWS, decode (DISTINCT_KEYS,0,1,DISTINCT_KEYS)

   into height, lf_rows, del_lf_rows, distinct_keys from index_stats;

 

   if ( height > 2 ) OR ( (del_lf_rows/lf_rows) > 0.2 and (del_lf_rows/lf_rows) <> 1)

     then dbms_output.put_line (rpad(r_indx.owner,16,' ') || rpad(r_indx.index_name,40,' ') ||

     lpad(round((del_lf_rows/lf_rows)*100,3),17,' ') ||

     lpad(height-1,7,' ') || lpad(round((lf_rows-distinct_keys)*100/lf_rows,3),16,' '));

   end if;

 end loop;

 

 DBMS_SQL.CLOSE_CURSOR(c_name);

end;

 

 

Voltar