Oracle – Ricostruire gli indici


La seguente procedura ‘RicostruzioneIndice’ prende in considerazione sia gli indici globali che locali..

N.B. Gli indici globali contengono valori di più partizioni della tabella, mentre quelli locali (disponibili solo da Oracle8) contengono valori delle singole partizioni. Questi ultimi sono più facili da gestire ma non possono effettuare controlli di univocità come avviene per quelli globali.

Gli indici globali vengono estratti nel cursore ‘cur_globale’ dalla vista USER_INDEX dove il valore della colonna ‘Partitioned’ è = ‘NO’ mentre quelli locali vengono estratti nel cursore ‘cur_locale’ .

Per ogni indice(globale o locale), la procedura genera statistiche utilizzando il comando ANALYZE INDEX con la clausola VALIDATE STRUCTURE; li estrae dalla vista INDEX_STATS, controlla i relativi valori dei campi HEIGHT, LF_ROWS e DEL_LF_ROWS e decide dove ricostruire o meno l’indice.

Create or Replace Procedure RicostruzioneIndice
(p_max_numero integer:= 3, p_max_delete integer:= 20)
is
cursor cur_indice is
select name,
height,
lf_rows as num_rec,
del_lf_rows as num_rec_del from index_stats; v_indice cur_indice%rowtype;
cursor cur_globale is
select index_name,
tablespace_name
from user_indexes
where partitioned = 'NO';
cursor cur_locale is
select index_name,
partition_name,
tablespace_name
from user_ind_partitions
where status = 'USABLE';
v_conta integer := 0;
begin
-- Indice Globale
for v_record in cur_globale
loop
execute immediate 'analyze index ' || v_record.index_name ||' validate structure';
open cur_indice;
fetch cur_indice into v_indice;
if cur_indice%found then
if (v_indice.height > p_max_numero) or
(v_indice.num_rec >0 and v_indice.num_rec_del > 0 and
(v_indice.num_rec_del * 100 / v_indice.num_rec) > p_max_delete)
then
v_conta := v_conta + 1;
dbms_output.put_line('Ricostruzione dell''indice ' ||v_record.index_name || '...');
execute immediate 'alter index ' || v_record.index_name ||
' rebuild' ||
' parallel nologging compute statistics' ||
' tablespace ' || v_record.tablespace_name;
end if;
end if;
close cur_indice;
end loop;
dbms_output.put_line('Indice globale ricostruito: ' || to_char(v_conta));
v_conta := 0;
-- Indice Locale
for v_record in cur_locale
loop
execute immediate 'analyze index ' || v_record.index_name ||
' partition (' || v_record.partition_name|| ') validate structure';
open cur_indice;
fetch cur_indice into v_indice;
if cur_indice%found then
if (v_indice.height > p_max_numero) or
(v_indice.num_rec > 0 and v_indice.num_rec_del > 0 and
(v_indice.num_rec_del * 100 / v_indice.num_rec)> p_max_delete)
then
v_conta := v_conta + 1;
dbms_output.put_line('Ricostruzione dell''indice ' ||v_record.index_name || '...');
execute immediate 'alter index ' || v_record.index_name ||
' rebuild' || ' partition ' || v_record.partition_name ||
' parallel nologging compute statistics' ||
' tablespace ' || v_record.tablespace_name;
end if;
end if;
close cur_indice;
end loop;
dbms_output.put_line('Indice locale ricostruito: ' || to_char(v_conta));
end RicostruzioneIndice;

Oracle – Ricostruire gli indici ultima modifica: 2007-07-02T00:00:00+00:00 da Enrico

Comments are closed.