1 job class
要点:
将相同的属性值集分配给成员作业
利用CREATE_JOB_CLASS过程创建
在作业类中指定作业(使用SET_ATTRIBUTE过程)
属于SYS模式
为成员作业设置资源分配
将服务属性设置为所需的数据库服务名称
将工作分组进行优先排序。
解释:
作业类是其参与成员作业的策略。每个作业类指定一组属性,比如日志级别。当将作业分配给作业类时,作业将继承这些属性。例如,可以为清除所有工资作业的日志条目指定相同的策略。
可以使用CREATE_JOB_CLASS过程创建作业类。类总是属于sys模式。要创建类,必须拥有管理调度程序权限。有一个名为DEFAULT_JOB_CLASS的默认作业类,它是使用数据库创建的。
创建作业类之后,可以在创建作业时指定作业作为该作业类的成员,或者在创建作业之后使用DBMS_SCHEDULER包的SET_ATTRIBUTE过程。如果作业与作业类没有关联,则该作业属于这个默认的作业类。
将作业类的服务属性设置为所需的数据库服务名称。这将确定运行成员作业的实际应用程序集群环境中的实例,以及分配给成员作业的可选系统资源。
为成员作业设置资源分配。作业类提供了数据库资源管理器和调度器之间的链接,因为每个作业类都可以将资源使用者组指定为一个属性。然后,成员作业属于指定的用户组,并根据当前资源计划中的设置分配资源。或者,可以将RESOURCE_CONSUMER_GROUP属性保留为空,并将作业类的服务属性设置为所需的数据库服务名称。该服务可以依次映射到资源使用者组。如果同时设置了RESOURCE_CONSUMER_GROUP和service属性,并且指定的服务映射到资源使用者组,RESOURCE_CONSUMER_GROUP属性中命名的资源使用者组优先。如果在创建作业类时没有指定资源使用者组,则作业类映射到DEFAULT_CONSUMER_GROUP资源使用者组。在启用资源管理器时,默认作业类中的作业或与默认资源使用者组关联的作业类中的作业可能没有分配足够的资源来完成它们的任务。
对工作进行分组以确定优先级。在同一个作业类中,可以为每个作业分配1-5的优先级值,这样,如果该类中的两个作业被安排同时启动,优先级高的优先。这就确保了你不会因为一个不太重要的工作而阻碍了一个更重要的工作的及时完成。如果两个作业分配的优先级值相同,则开始日期较早的作业优先。如果没有为作业分配优先级,则其优先级默认为3。
2 windows
工作的优先级会在一段时间内发生变化。例如,可能希望在夜间将较高百分比的数据库资源分配给数据仓库加载作业,并在白天将较高百分比的资源分配给应用程序作业。为此,可以使用调度器窗口更改数据库资源计划。
调度器窗口可以在一天、一周等的不同时间段自动启动作业或更改作业之间的资源分配。窗口由一个具有明确开始和结束的时间间隔表示,例如“从中午12点到早上6点”。
在任何给定的时间内,只有一个窗口可以生效。
可以使用CREATE_WINDOW过程创建一个窗口。
调度器窗口使用作业类来控制资源分配。每个窗口指定在窗口打开(变为活动)时要激活的资源计划,每个作业类指定一个资源使用者组或一个数据库服务,这些资源使用者组可以映射到一个使用者组。因此,在窗口内运行的作业根据其作业类的使用者组和窗口的资源计划(如本幻灯片中的图形所示)分配给它的资源。
3 window中job的优先级
在数据库中创建多个作业时,需要一种方法使作业处理与业务需求保持一致,并指定哪些作业具有最高的优先级。对于一个特定的窗口,可以运行几个类的作业,每个类都有自己的优先级。
有两个级别可以对作业进行优先排序:类级别和作业级别。
第一个优先级是在类级别,使用资源计划。不同类的工作之间的优先级纯粹是在类资源分配的基础上完成的。
第二个优先级是在类中,具有作业的作业优先级属性。
只有当同一个类中的两个作业同时开始时,优先级才相关。优先级较高的任务首先开始。
不同工作类别的工作不能保证优先考虑。例如,APPL_JOBS作业类中的高优先级作业可能不会在ADMIN_JOBS作业类中的低优先级作业之前启动,即使它们共享相同的调度。如果APPL_JOBS作业类有较低级别的可用资源,那么该类中的高优先级作业必须等待资源可用,即使另一个作业类中的低优先级作业也有可用资源。
4 示例:创建Job Array
- 声明sys类型的变量。工作和sys.job_array:
DECLARE
newjob sys.job;
newjobarr sys.job_array; - 初始化job array:
BEGIN
newjobarr := SYS.JOB_ARRAY(); - 给作业数组设置大小,用于存放所需的作业数量:
newjobarr.EXTEND(100); - 在作业数组中放置作业
FOR i IN 1…100 LOOP
newjob := SYS.JOB(job_name => ‘LWTJK’||to_char(i),
job_style => ‘LIGHTWEIGHT’,
job_template => ‘MY_PROG’,
enabled => TRUE );
newjobarr(i) := newjob;
END LOOP; - 作为一个事务,提交job
DBMS_SCHEDULER.CREATE_JOBS(newjobarr, ‘TRANSACTIONAL’);
解释:START_TIME参数默认为NULL,因此计划立即启动作业。
- 声明用于保存作业定义和作业数组变量的变量。
- 使用SYS. permission初始化作业数组。JOB_ARRAY构造函数。这将在数组中为一个作业创建一个位置。
- 将数组的大小设置为预期作业的数量。
- 创建每个作业并将其放置在数组中。惟一的区别是作业的名称。作业的START_TIME变量被省略,默认值为NULL,表示作业将立即运行。
- 使用CREATE_JOBS过程将数组中的所有作业作为一个事务提交。
5 练习题
选择关于高级调度器特性和功能的正确语句:
A 可以使用作业数组创建轻量级作业。
B 在类级别(通过资源计划)和在作业级别(具有作业优先级属性)对作业进行优先排序是相互排斥的。
C 调度器窗口使用作业类来控制资源分配。
D 作业链用于实现“依赖调度”。
答案:ACD