-- @S:\upd.rman.estat.sql
CREATE OR REPLACE PROCEDURE SYS.UPD_RMAN_ESTAT
IS
vTobjlist DBMS_STATS.ObjectTab;
vAux varchar2(60);
vCRLF varchar2(2) := chr(13)||chr(10);
vParte number := 1;
vSender varchar2(30) := 'rman.gaivota@xxx.zzz';
vRcpt varchar2(30) := 'sabd@xxx.zzz';
vSubj varchar2(50) := 'Cálculo de estatísticas para rman@rman.gaivota';
vMessage varchar2(32000):=null;
/*
GRANT ANALYZE ANY TO SYS
/
ALTER SESSION SET NLS_TERRITORY='AMERICA';
ALTER SESSION SET NLS_LANGUAGE='AMERICAN';
DECLARE
JOBNO NUMBER;
BEGIN
DBMS_JOB.SUBMIT(
JOBNO, 'SYS.UPD_RMAN_ESTAT;',
sysdate+1/1440,
'trunc(next_day(sysdate,''SATURDAY''))+23/24' );
COMMIT;
END;
/
*/
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET OPTIMIZER_MODE=ALL_ROWS';
-- para calcular as estatísticas
DBMS_STATS.GATHER_SCHEMA_STATS
(
ownname => 'RMAN' ,
method_opt => 'FOR ALL INDEXED COLUMNS SIZE 1',
--estimate_percent=> 50, -- null significa compute (+preciso +demorado), em vez de estimate sobre 50%
--block_sample => true,
--cascade => true, -- calcula inclusive nos índices
objlist => vTobjlist, -- lista objetos onde foram calculadas estatísticas
options => 'GATHER AUTO' -- tabelas sem estats ou com estats desatualizada (ver alter table ...monitoring)
);
-- para mandar um email com informação sobre quais objetos foram atualizados
for i in vTobjlist.first..vTobjlist.last loop
vAux := vTobjlist(i).objtype||'-'||vTobjlist(i).objname||vCRLF;
if nvl(length(vMessage),0)+nvl(length(vAux),0) < 32000 then
vMessage := vMessage || vAux;
else
system.send_email(vSender, vRcpt, vSubj||' Parte '||to_char(vParte), vMessage);
vParte := vParte + 1;
vMessage := vAux;
end if;
end loop;
if vParte > 1 then
vSubj := vSubj || ' Parte '||to_char(vParte);
end if;
DBMS_UTILITY.COMPILE_SCHEMA('RMAN');
system.send_email(vSender, vRcpt, vSubj, vMessage);
END UPD_RMAN_ESTAT;
/