概述 轻量级作业

在 Oracle 数据库 10g 中,只有一种类型的计划程序作业。在 Oracle Database 11g 中,您还可以创建所谓的轻量级作业(也称为持久轻量级作业),该作业从作业模板派生其权限,在某些情况下,派生其作业元数据。与轻量级作业不同,常规作业是完全独立的,它们仍然是更灵活的作业类型,但每次创建一个作业时都会产生开销。在数据库可能必须创建和删除数千个作业的情况下,改用轻量级作业可能更明智。如果你打算使用少量的不经常工作,你最好坚持传统的常规工作。轻量级作业不像常规计划程序作业那样是架构对象。因此,与常规作业相比,创建和删除轻量级作业的开销要小得多。轻量级作业也更快地创建并仅占用作业元数据和运行时数据的空间。轻量级作业有助于在 RAC 环境中更轻松地进行恢复和负载平衡,因为它们具有较小的物理占用空间,并且由于为作业创建的元数据量最少,因此需要较少的重做。总体目标是减少创建作业所需的时间,并降低作业创建过程中涉及的开销。

与常规计划程序作业不同,在创建轻量级作业时必须使用作业模板。作业模板是一种新型的数据库对象,除了提供轻量级作业将继承的权限外,它还为轻量级作业提供元数据。存储过程或计划程序都可以用作轻量级作业的模板。因此,轻量级作业从父作业模板继承其权限。

  • 您无法创建完全独立的轻量级作业。相反,您必须使用模板。可以使用存储过程或计划程序作为轻量级作业的模板。
  • 您无法基于每个作业设置权限,因为轻量级作业从父作业模板继承权限。
  • 只有一组有限的作业属性适用于轻量级作业,而常规作业提供更多选择。

总而言之,轻量级作业是一种特殊类型的计划程序作业,如果数据库必须快速创建大量作业,则可以使用它代替传统作业。

创建轻量级作业

创建作业模板

您可以创建一个作业模板,该模板是必需的
BEGIN
DBMS_SCHEDULER.create_program(
program_name = > “test_prog
”,
program_action = > “声明
current_time日期;
current_time 从

dbms_output.put_line(current_time);
end;',
program_type = > ”plsql_block“,
启用 = > true);
结束;

/

属性program_type允许您指定要创建的程序的类型。对于轻量级作业,可以使用plsql_block或stored_procedure作为 program_type 属性的值。您可以为匿名 PL/SQL 块指定plsql_block值,本示例就是这种情况。您可以为作为 PL/SQL 或 Java 存储过程或外部 C 子程序的程序指定值stored_procedure。

请注意,轻量级作业始终需要基于过程或计划程序的作业模板。与常规作业不同,不能内联轻量级作业,但必须始终使用命名程序。在我们的示例中,程序test_prog充当此轻量级作业的模板。

创建单个轻量级作业

对于轻量级作业,必须使用新的作业参数 job_style 并为其分配一个值 LIGHTWEIGHT。您可以通过直接在CREATE_JOB过程中指定时间和频率来创建轻量级作业,也可以使用计划来设置作业的计时和频率属性。您只能为轻量级作业指定几个参数。这些是作业参数和计划参数。轻量级作业从父作业模板继承用于运行作业的其他元数据及其权限。以下是创建轻量级作业的考试:

开始
DBMS_SCHEDULER.create_job(
job_name = > “test_ltwtjob1”,
program_name = > “test_prog”,
repeat_interval = > “FREQ = 每日;BYHOUR=10',
end_date=>“31-DEC-08 06:00:00 AM 澳大利亚/悉尼”,
评论=>“轻量级工作”);
结束;

/

您还可以基于命名程序(充当模板)和预先存在的计划创建轻量级作业,如以下示例所示:
BEGIN
DBMS_SCHEDULER.create_job(
job_name = > “test_ltwtjob2”,
program_name = > “test_prog”,
schedule_name = > “DAILY_PURGE_SCHEDULE”,
job_style = > “轻量级”,
注释 = > “基于程序和计划的轻量级作业”);
结束;

/

创建轻量级作业数组

Oracle 数据库 11g 为您提供了一种通过创建作业阵列来创建一组作业的方法。当您需要创建相当数量的计划程序作业(常规或轻量级)时,创建作业数组并将其提交一次比向数据库提交大量单个作业创建请求要高效得多。可以将作业数组的概念用于常规作业和新的轻量级作业。要将作业数组作为单个事务提交,我们可以使用CREATE_JOBS过程。在下面的示例中,我将向您展示轻量级作业和作业数组的效率。

申报
测试系统;
睾丸sys.job_array;
l_start号;
开始
测试 := sys.job_array();
testjobarr.extend(10000);

l_start := DBMS_UTILITY

对于我在1..5000 循环
测试作业 := 系统作业(job_name => “TETJOB” ||TO_CHAR(I),
job_style =>“轻量级”,
job_template = > “TEST_PROG”,
启用 = > TRUE);
测试工作(i) := 测试工作;
结束循环;
DBMS_OUTPUT。PUT_LINE(“轻量级阵列):”||(DBMS_UTILITY获取时间 - l_start));
l_start := DBMS_UTILITY
对于我在5001..10000 循环
测试作业 := 系统作业(job_name => “TETJOB” ||TO_CHAR(I),
job_style=>“常规”,
job_template=>“TEST_PROG”,
启用=>TRUE);
测试工作(i) := 测试工作;
结束循环;
DBMS_OUTPUT。PUT_LINE(“常规数组):” ||(DBMS_UTILITY获取时间 - l_start));
l_start := DBMS_UTILITY
对于我在1..100 LOOP
DBMS_SCHEDULER.create_job(
job_name = > lightweight_job_“ || i,
program_name = > ”lightweight_program“ ,
job_style = > ”轻量级“,
启用 = > TRUE);
结束循环;
DBMS_OUTPUT。PUT_LINE(“轻量级):”||(DBMS_UTILITY获取时间 - l_start));
l_start := DBMS_UTILITY
对于我在1..100 循环
DBMS_SCHEDULER.create_job(
job_name = > || i > “regular_job_” program_name
= > “lightweight_program”,
job_style = > “常规”,
启用 = > TRUE);
结束循环;
DBMS_OUTPUT。PUT_LINE(“常规):”||(DBMS_UTILITY获取时间 - l_start));

dbms_scheduler.create_jobs(测试平台,“事务性”);
结束;

/

要删除作业,可以使用以下命令:

开始
DBMS_SCHEDULER。DROP_JOB(“我的工作1”);
结束;

/

使用用于常规作业的相同视图来查看有关轻型作业的信息。例如,您可以查询DBA_SCHEDULER_JOBS视图以查找有关轻量级作业的详细信息,如下所示:


从dba_scheduler_jobs中选择job_name,program_name,job_style,job_action

请注意,您无法在DBA_OBJECTS视图中查看任何轻量级作业,因为与常规计划程序作业不同,轻量级作业不是数据库对象。

 

参考至:《McGraw.Hill.OCP.Oracle.Database.11g.New.Features.for.Administrators.Exam.Guide.Apr.2008》

http://www.oracle-base.com/articles/11g/scheduler-enhancements-11gr1.php

http://docs.oracle.com/cd/E11882_01/server.112/e25494/schedover.htm#CHDECJDB

http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_sched.htm#BABCIJJA

http://docs.oracle.com/cd/E11882_01/server.112/e25494/appendix_a.htm#adminAppendixA

本文原创,转载请注明出处、作者

如有错误,欢迎指正