GPO ( Grupo de Profissionais Oracle )
A maior comunidade Oracle do Brasil !

Rebuild INDEX !

Galera,

Mais uma contribuição que talvez seja útil..dependendo de como sua base de dados estiver configurada! Sabemos que a melhor maneira de ganhar espaço na sua BD é simplesmente não o desperdiçar!! Com uma política de alocação nas tablespaces criada para que evite a sua fragmentação interna, procure usar sempre Tablespaces LMT (Lacally Managed Tablespace), tendo extents com uniform size, tendo uma tablespace para cada tamanho de objeto (pequeno, médio, grande). Cuidar sempre dos seus parâmetros de storage, para que eles sejam adequados (principalmente PCTFREE/PCTUSED para as tabelas), no mais é estar sempre observando o comportamento dos seus dados, de que forma eles crescem nas tablespaces..
Mas, se já tiver pego um ambiente mal-tratado…o procedimento abaixo pode te ajudar!!

O procedimento abaixo faz uma busca por todos os índices do seu schema (ou vários)e para aqueles que estiverem fragmentados faz:

1) Gera o comando para reconstruí-lo. (O rebuild)
2) Insere na tabela índices_frag com a percentagem de fragmentação e a data de análise.

Criar esta tabela antes de executar o procedimento:

CREATE TABLE SCHEMA.INDICES_FRAG
(
OWNER VARCHAR2(30 BYTE),
INDEX_NAME VARCHAR2(30 BYTE),
TABLE_NAME VARCHAR2(30 BYTE),
HEIGHT NUMBER,
PARTITION_NAME VARCHAR2(30 BYTE),
LEAF_ROWS NUMBER,
DEL_LEAF_ROWS NUMBER,
DEL_LEAF_PERC NUMBER,
DATA_ANALYZE DATE DEFAULT SYSDATE)
TABLESPACE XXX;

Depois, em uma sessão do SQLPLUS, faça:

set serveroutput on size 100000
set linesize 160
set pagesize 100
alter session set nls_date_format='dd-mm-yyyy hh24:mi';

Atenção que, no script abaixo, onde consta:

1 – and owner in (‘SCHEMA A ANALISAR’);
2 – insert into seu_schema;

mude para o schema que vc quer rodar!

Aí vai!

DECLARE
v_owner dba_indexes.owner%TYPE;
v_index_name dba_indexes.index_name%TYPE;
v_table_name dba_indexes.table_name%TYPE;
v_analyze VARCHAR2(100);
v_cursor NUMBER;
v_numrows INTEGER;
v_height index_stats.height%TYPE;
v_leaf_rows index_stats.lf_rows%TYPE;
v_del_leaf_rows index_stats.del_lf_rows%TYPE;
v_del_leaf_perc NUMBER;

/* Cursor principal */

CURSOR c_global_indexes is
select owner, index_name, table_name
from dba_indexes
where partitioned = 'NO'
--and owner not like 'SYS%'
and owner in ('SCHEMA A ANALISAR')
order by table_name;
BEGIN

/* For every index, validate structure */
OPEN c_global_indexes;
LOOP
FETCH c_global_indexes INTO v_owner,v_index_name, v_table_name;
EXIT WHEN c_global_indexes%NOTFOUND;
/* Open DBMS_SQL cursor */
v_cursor := DBMS_SQL.OPEN_CURSOR;
v_analyze := 'ANALYZE INDEX ' || v_owner || '.' || v_index_name || ' VALIDATE STRUCTURE';
DBMS_SQL.PARSE(v_cursor,v_analyze,DBMS_SQL.V7);
v_numrows := DBMS_SQL.EXECUTE(v_cursor);
/* Close DBMS_SQL cursor */
DBMS_SQL.CLOSE_CURSOR(v_cursor);
/* Se o índice está fragmentado, gera o comando para reconstruí-lo */
SELECT height,
lf_rows,
del_lf_rows
INTO v_height,
v_leaf_rows,
v_del_leaf_rows
FROM INDEX_STATS;

IF v_leaf_rows = 0 THEN /* para evitar a divisão por zero */
v_del_leaf_perc := 0;
ELSE
v_del_leaf_perc := round((v_del_leaf_rows / v_leaf_rows) * 100);
END IF;

if (v_height > 3) or /* 0 and
v_del_leaf_rows > 0 and
v_del_leaf_perc > 20) then /* <-- Percentagem de fragmentação */
DBMS_OUTPUT.PUT_LINE('Alter index ' || v_owner || '.' || v_index_name ||' /* '||v_table_name||' '||v_del_leaf_perc||' */'|| ' rebuild nologging;');
insert into seu_schema.indices_frag (
owner, index_name, table_name, height, leaf_rows, del_leaf_rows, del_leaf_perc )
values (v_owner,v_index_name,v_table_name,v_height,v_leaf_rows,v_del_leaf_rows,v_del_leaf_perc);
commit;
END IF;

END LOOP;
CLOSE c_global_indexes;
commit;
END;
/

Esse procedimento vai te gerar a linha pronta, apenas restando executar!

Como essa:

alter index ANI.APC_PK /* ANI_PRE_CAL_03 0 */ rebuild nologging;

CUIDADO, verifique antes como está o nível de processamento da sua base de dados, esse rebuild pode sobrecarregar um pouco….

Abraços!!

Marcelo Ramasine

Share

You may also like...

Deixe um comentário

O seu endereço de e-mail não será publicado.