-- @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;
/

hostgator