ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle任务调度工具学习

Oracle任务调度工具学习

原创 Linux操作系统 作者:regonly1 时间:2012-03-06 15:35:29 0 删除 编辑

没想到接触Oracle任务调度工具是从解决Oracle自动统计功能开始的。

      话说从10g开始,cbo便大行其道,oracle更是不遗余力的在推动这个优化器,因为它可以智能化的生成执行计划。但是,要实现智能化,就必须有大量的后台数据做支撑。这些用来告诉优化器如何去生成计划的数据就是表的统计信息,包括行数、块数、基数等各类运行时所需考虑的成本。

      但是,这些智能化所依赖的信息是不会自然生成的,也不会在表数据的变化的时候自动告诉优化器,我的数据变化了,变化了哪些。所以,Oracle要有一个工具按照一定的时间规则去搜集这些信息。于是便有了Oracle的自动统计功能,其对应的任务名称为:GATHER_STATS_JOB。

      该功能是通过dbms_schedule包来实现的,是对数据库所有的表信息进行统计和搜集。

      默认的,在数据库创建的时候就创建了gather_stats_job,执行dbms_stats.gather_database_stats_job_proc过程,使用schedular。默认的定义了两个窗口:
weekenight_window定义在下午10点到上午六点.从周一到周五.
weekend_window定义从上午12点到周一12点。

      从这样的情况来看,执行的时间与我系统的一个批处理时间是重合的,两个在一起处理的时候都会占用大量的资源,而导致互相争夺的情况出现。为了错开两个处理时间,必须要将其中一个的触发点延后,我选择了自动统计,将其延到凌晨三点,此时批处理已经处理完成,所以可以正常搜集统计信息了。

      要做的事情很简单,两个步骤:
1、取消原有的计划模式
call dbms_scheduler.set_attribute('GATHER_STATS_JOB', 'SCHEDULE_NAME', '');

2、启用新的调度模式(每天凌晨三点开始执行)
call dbms_scheduler.set_attribute('GATHER_STATS_JOB', 'REPEAT_INTERVAL', 'FREQ=DAILY;BYHOUR=3');
      如果需要改为每周执行一次(以下表示在每个星期六的晚上10点执行该计划),则可以如下:
call dbms_scheduler.set_attribute('GATHER_STATS_JOB', 'REPEAT_INTERVAL', 'FREQ=WEEKLY;BYDAY=SAT;BYHOUR=22');

3、如果该调度没有启用,则可以按如下命令启用:
call dbms_scheduler.enable('GATHER_STATS_JOB');

4、如果需要停止正在执行的中的调度,则可以:
begin dbms_scheduler.stop_job('GATHER_STATS_JOB',true); end;

参考网页:
http://space.itpub.net/7301064/viewspace-468575
http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sched.htm

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

请登录后发表评论 登录
全部评论

注册时间:2008-05-10

  • 博文量
    257
  • 访问量
    1013546