持久轻量作业:
• 是使用作业模板创建的
• 是可恢复的
• JOB_STYLE => LIGHTWEIGHT
新增的调度程序功能:轻量作业
有些客户需要每秒创建数百个作业。对于定期作业,每个作业都要创建一个数据库对象,
用于描述作业、修改多个表以及在进程中创建重做。在Oracle Database 11g调度程序中,
有一个持久轻量作业。轻量作业的目的是减少启动作业所需的开销和时间。将为作业创建
最少的元数据。这可以减少启动作业时所需的时间和创建的重做。
要达到这些目的,轻量作业在磁盘上占用了很小的空间用于作业元数据和存储运行时数
据。磁盘上的占用空间还支持在RAC 环境中进行恢复和负载平衡。
轻量作业始终是使用
作业模板创建的
,作业模板可以是存储过程或程序。存储过程可以保存作业所需的所有信
息。可能会设置一些作业属性(如作业参数)。
作业模板是使用
DBMS_SCHEDULER.CREATE_PROGRAM过程创建的。
Oracle Database 11g继续支持基于数据库对象的作业,自从在Oracle 10g中首次引入
Oracle Scheduler 以来,这些作业就一直存在。轻量作业的目的不是取代这些作业,因为
每个作业类型都有其自身的优势,用户可以根据自己的需求灵活地选择作业。
• 定期作业
– 开销最高
– 最佳恢复
– 最灵活
• 持久轻量作业
– 开销较低
– 部分恢复
– 属性更改受限
选择正确的作业
这两种作业类型的优点和缺点如下:
• 定期作业的灵活性最高,但在执行创建/删除时需要大量的开销。可以用单个命令创
建作业。用户可以细粒度地控制对作业的权限,还可以使用属于其它用户的程序或存
储过程。定期作业需要创建和删除作业数据库对象。此操作将更新多个表及关联的重
做。如果用户创建的作业数量相对较少,并且这些作业的运行频率相对较低,则应选
择定期作业。
• 持久轻量作业在创建/删除时间方面有很大改进,因为它没有创建数据库对象的开
销。每个轻量作业都是使用作业模板创建的,并作为程序进行存储。因为持久轻量作
业在运行时要向磁盘写入状态信息,所以在执行时应该只有少量改进。持久轻量作业
有多种限制:
- 用户无法设置对这些作业的权限,它们将从父作业模板中继承其权限。
- 必须使用模板,无法创建完全自包含的持久轻量作业。
- 只有一些特定的作业属性是可设置的,如JOB_ARGUMENTS。
如果用户需要在非常短的时间内创建大量作业(每秒10 -100 个作业),并且有一组
程序(作业模板)可供使用,则最适合使用轻量作业。
创建单个轻量作业
DBMS_SCHEDULER程序包已重载了一些程序包,这样便可以使用最少的新语法来创建轻
量作业。轻量作业只有很少的参数可以指定:
作业参数和计划
。作业的其余元数据(包括
权限)都是从作业模板继承来的。轻量作业的模板必须是PL/SQL 块或存储过程。轻量作
业必须使用DBMS_SCHEDULER程序包在PL/SQL 中创建。JOB_STYLE参数在EM 中是不
可见的。
在图片的第一个示例中,MY_PROG是作业模板,计划是在CREATE_JOB方法中创建
的。
在第二个示例中,通过已命名的计划应用了计划。
下面是一个
简单模板示例:
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name=>'"SYSTEM"."MY_PROG"',
program_action=>
'DECLARE time_now DATE;
BEGIN
SELECT SYSDATE INTO time_now FROM DUAL;
END;',
program_type=>'PLSQL_BLOCK',
enabled=>TRUE);
END;
创建轻量作业数组
使用作业数组是一种效率较高的创建作业集的方式。这也适用于轻量作业。作业数组类型
和CREATE_JOBS过程是Oracle Database 11g中DBMS_SCEHDULER程序包的新增功能。
在示例中,在一个作业数组中创建了100 个作业说明,并且将这些说明提交到了
单个事务处理的作业队列中。请注意,对于轻量作业,所需的信息量非常有限。在此示例
中,start_time参数默认为NULL,因此作业被安排为立即启动。在后面的两页中将继
续介绍该示例。
1.声明用于存储作业定义的变量和作业数组变量。
2.使用SYS.JOB_ARRAY构造器初始化作业数组。这将为数组中的每个作业创建一个
空间。
3.将数组大小设置为预期的作业数。
注:如果数组很小,则性能不会显著优于提交单个作业时的性能。
4. 创建每个作业,并将其放入数组。在此示例中,唯一的差异是作业的名称。作业的
start_time变量将被省略并默认为NULL,表示将立即运行该作业。
5. 使用CREATE_JOBS过程将数组中的所有作业作为一个事务处理提交。
此示例的全部代码如下:
DECLARE
newjob sys.job;
newjobarr sys.job_array;
BEGIN
-- Create an array of JOB object types
newjobarr := sys.job_array();
-- Allocate sufficient space in the array
newjobarr.extend(100);
-- Add definitions for jobs
FOR i IN 1..100 LOOP
-- Create a JOB object type
newjob := sys.job(job_name => 'LWTJK' || to_char(i),
job_style => 'LIGHTWEIGHT',
job_template => 'PROG_1',
enabled => TRUE );
-- Add job to the array
newjobarr(i) := newjob;
END LOOP;
-- Call CREATE_JOBS to create jobs in one transaction
DBMS_SCHEDULER.CREATE_JOBS(newjobarr, 'TRANSACTIONAL');
END;
/
在字典中查看轻量作业
在Oracle Database 11g中,为支持轻量作业而对字典视图进行的更改非常少。
• 没有添加新视图。
• 轻量作业与定期作业同时显示在以下视图中:DBA_SCHEDULER_JOBS、
ALL_SCHEDULER_JOBS和USER_SCHEDULER_JOBS。
• 轻量作业的参数和定期作业的参数同时显示在以下视图中:
DBA_SCHEDULER_JOB_ARGS、ALL_SCHEDULER_JOB_ARGS和
USER_SCHEDULER_JOB_ARGS。
• 因为轻量作业不是数据库对象,所以无法通过DBA_OBJECTS、ALL_OBJECTS和
USER_OBJECTS视图查看轻量作业。