利用dbms_scheduler收集统计信息

--OLAP的应用,表的统计信息总是过期,领导要求也个JOB自动收集统计信息,自己在本机做了个实验。方便以后使用。
首先先创建一个PROCEDURE,收集统计信息,这个可以随便写,如果数据库SCHEMA多的话,最好分开来并行一起。
create or replace procedure Gathering_Job1 as
begin
dbms_stats.gather_database_stats;
end;
/


--然后利用dbms_scheduler创建JOB,可以指定时间以及频率。
begin
     sys.dbms_scheduler.create_job(job_name            => 'Gathering_Job2_test',
                                    job_type            => 'STORED_PROCEDURE',
                                    job_action          => 'Gathering_Job1', 
                                    start_date          => to_timestamp('20150317 10:00:00','yyyymmdd hh24:mi:ss'),
                                    repeat_interval => 'FREQ=WEEKLY;BYHOUR=10;BYMINUTE=0;BYSECOND=0',
                                    end_date            => to_date(null),
                                    job_class           => 'DEFAULT_JOB_CLASS',
                                    enabled             => true,
                                    auto_drop           => false,
                                    comments            => 'Gathering_Job2');
    end;
    /

--这样就创建成功了。


--下面看一下按照SCHEMA收集的情况,由于我不是用SYS用户创建的(并没有SYS权限),创建存储过程和CREATE JOB是没有问题的
create or replace procedure Weekly_Gathering_Job1 as
begin
  dbms_stats.gather_schema_stats(ownname          => '"ABC"',
                                 cascade          => DBMS_STATS.AUTO_CASCADE,
                                 estimate_percent => dbms_stats.auto_sample_size,
                                 degree           => 16,
                                 no_invalidate    => DBMS_STATS.AUTO_INVALIDATE,
                                 granularity      => 'AUTO',
                                 method_opt       => 'FOR ALL COLUMNS SIZE AUTO',
                                 options          => 'GATHER');
end;
/


SQL> begin
  2    sys.dbms_scheduler.create_job(job_name            => ' WEEKLY_GATHERING_JOB_TEST1 ',
  3                                  job_type            => 'STORED_PROCEDURE',
  4                                  job_action          => 'WEEKLY_GATHERING_JOB1',
  5                                  start_date          => to_timestamp('20150322 2:00:00','yyyymmdd hh24:mi:ss'),
  6                                  repeat_interval => 'FREQ=WEEKLY;BYHOUR=2;BYMINUTE=0;BYSECOND=0',
  7                                  end_date            => to_date(null),
  8                                  job_class           => 'DEFAULT_JOB_CLASS',
  9                                  enabled             => true,
10                                  auto_drop           => false,
11                                  comments            => 'Weekly Statistics Gathering Job1');
12  end;
13  /

PL/SQL procedure successfully completed.

--但是到下面去执行包的时候就会报错。

SQL>   -- run job
SQL> begin
  2     dbms_scheduler.run_job('WEEKLY_GATHERING_JOB_TEST1',TRUE);
  3  end;
  4  /
begin
*
ERROR at line 1:
ORA-20000: Insufficient privileges to analyze an object in Schema
ORA-06512: at "SYS.DBMS_STATS", line 25335
ORA-06512: at "SYS.DBMS_STATS", line 25414
ORA-06512: at "SYS.DBMS_STATS", line 25367
ORA-06512: at "SSO502349750.WEEKLY_GATHERING_JOB1", line 3
ORA-06512: at "SYS.DBMS_ISCHED", line 196
ORA-06512: at "SYS.DBMS_SCHEDULER", line 486
ORA-06512: at line 2

--下面在创建存储过程的时候指定SCHEMA名字
create or replace procedure  ABC .Weekly_Gathering_Job1 as
begin
  dbms_stats.gather_schema_stats(ownname          => '"ABC"',
                                 cascade          => DBMS_STATS.AUTO_CASCADE,
                                 estimate_percent => dbms_stats.auto_sample_size,
                                 degree           => 16,
                                 no_invalidate    => DBMS_STATS.AUTO_INVALIDATE,
                                 granularity      => 'AUTO',
                                 method_opt       => 'FOR ALL COLUMNS SIZE AUTO',
                                 options          => 'GATHER');
end;
/


SQL> begin
  2        sys.dbms_scheduler.create_job(job_name            => 'WEEKLY_GATHERING_JOB_TEST1',
  3                                      job_type            => 'STORED_PROCEDURE',
  4                                      job_action          => ' ABC .WEEKLY_GATHERING_JOB1',--注意,这个地方也需要指定SCHEMA名字,否则会报莫名其妙的错误,ORA-06576: not a valid function or procedure name
  5                                      start_date          => sysdate,
  6                                      repeat_interval => 'FREQ=WEEKLY;BYHOUR=2;BYMINUTE=0;BYSECOND=0',
  7                                      end_date            => to_date(null),
  8                                      job_class           => 'DEFAULT_JOB_CLASS',
  9                                      enabled             => true,
10                                     auto_drop           => false,
11                                     comments            => 'Weekly Statistics Gathering Job1');
12     end;
13     /

PL/SQL procedure successfully completed.

--再执行的时候就OK了。
SQL>    begin
  2         dbms_scheduler.enable('WEEKLY_GATHERING_JOB_TEST1');
  3      end;
  4      /

PL/SQL procedure successfully completed.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26084062/viewspace-1462843/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26084062/viewspace-1462843/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DBMS_SCHEDULER是Oracle数据库中的一个内置程序包,用于管理和调度作业、程序和链。它是Oracle Scheduler的主要接口,可以通过它来创建、修改和删除作业、程序和链,以及控制它们的执行时间和执行方式。 下面是一些DBMS_SCHEDULER的常见用法: 1. 创建作业 使用DBMS_SCHEDULER.CREATE_JOB过程可以创建作业。在创建作业时,需要指定作业名称、作业类型、作业所属的程序等信息。 2. 修改作业 使用DBMS_SCHEDULER.SET_ATTRIBUTE过程可以修改作业的属性,如作业的状态、开始时间、结束时间等。 3. 删除作业 使用DBMS_SCHEDULER.DROP_JOB过程可以删除作业。 4. 运行作业 使用DBMS_SCHEDULER.RUN_JOB过程可以手动运行作业。 5. 暂停作业 使用DBMS_SCHEDULER.DISABLE过程可以暂停作业的执行。 6. 恢复作业 使用DBMS_SCHEDULER.ENABLE过程可以恢复暂停的作业。 7. 创建程序 使用DBMS_SCHEDULER.CREATE_PROGRAM过程可以创建程序。在创建程序时,需要指定程序名称、程序类型、程序所属的语言等信息。 8. 修改程序 使用DBMS_SCHEDULER.SET_PROGRAM_ARGUMENT_VALUE过程可以修改程序的参数值。 9. 删除程序 使用DBMS_SCHEDULER.DROP_PROGRAM过程可以删除程序。 10. 创建链 使用DBMS_SCHEDULER.CREATE_CHAIN过程可以创建链。在创建链时,需要指定链名称、链包含的步骤等信息。 11. 修改链 使用DBMS_SCHEDULER.SET_CHAIN_STEP_ATTRIBUTE过程可以修改链的步骤属性,如步骤名称、步骤类型、步骤所属的程序等。 12. 删除链 使用DBMS_SCHEDULER.DROP_CHAIN过程可以删除链。 以上是一些DBMS_SCHEDULER的常见用法,具体使用方法可参考Oracle官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值