SGA 中的另外一个重要结构是共享池。共享池存储了应用执行需要的PL/SQL块结构,SQL语句的文本、SQL编译后的可
执行代码、系统数据字典等。
恰当的共享池尺寸设置将减少系统各种资源的使用。首先,对于SQL、PL/SQL 来说,共享池提供了运行状态下的临时
存储点,后续执行的SQL和PL/SQL将使用已被缓存的编译结果及执行计划,有效减少系统CPU的使用,减少用户调用事件。
第二,栓、锁资源的争用被环节。第三,数据字典信息将被缓存在共享池中,因此,有关系统的信息不必再去执行查询,
这就降低了资源的使用。
在库缓存中区域中,存储着SQL、PL/SQL、Java类的源码、执行计划、伪编译后可执行代码等。当应用程序运行时,这些代码会被调用。如果这些代码在前面不久的应用运行中已经被调用执行过,则可能被后续执行的应用程序共享。默认地,Oracle将试图重复使用现有的代码,实现重用。也就是说,后续应用的执行能够引用前期应用执行中编译过的代码,这称为库缓存的“命中”。一次命中意味着一次
如软解析,SQL、PL/SQL的硬解析及编译过程的资源开销将被避免。
假设后续应用在执行中不能 ......
从AIX 角度,我们可以在下面三个角度衡量内存使用的合理性
1>减少页面交换操作
当操作系统需要更多内存页以支持其他应用运行时,操作系统将依据某种算法(LRU算法)把当前驻留在内存中的某些
数据页"Page Out",也就是把内存中的数据页从内存段转移到物理磁盘。显然,这种类型的操作会影响整个系统的运行性能。
对于数据库这种内存敏感类型的应用系统来说,这点尤为重要。因为数据库需要把数据放在内存中操作,这部分内存区域
称为“数据高速缓存”。
因此,一般在系统设计时,我们往往将数据库安装在一台服务器上,独占这台服务器的所有资源,避免页交换的产生。
在数据库配置时,也避免过度地将内存结构分配给数据库,人为造成操作系统空余内存的紧张。
2>SGA应宿主在物理内存中
分配SGA的目的就是为了快速地将数据存储在内存中,因为内存速率和硬盘速率相比,差别至少在4个数量级以上。如果
SGA对应的虚拟内存页被交换到换页空间(磁盘)上,那么SGA也就没有意义了。
我们可以通过 show sga命令查看系统全局区当前的分配情况:
SQL>show sga
Total System Global Area 285212672 bytes
Fixed Size &nb ......
这篇论坛文章(赛迪网技术社区)针对DBMS_SCHEDULER的使用方法进行了详尽的介绍,更多内容请参考下文:
DBMS_SCHEDULER是Oracle 10G中新增的一个包,与老版本的dbms_job包相比,dbms_scheduler有很多新特性,我将通过一系列的文章来介绍一下如何使用这个包.
1. 创建job
job是什么呢? 简单的说就是计划(schedule)加上任务说明. 另外还有一些必须的参数.
这里提到的"任务"可以是数据库内部的存储过程,匿名的PL/SQL块,也可以是操作系统级别的脚本.
可以有两种方式来定义"计划":
1) 使用DBMS_SCHDULER.CREATE_SCHEDULE 定义一个计划;
2) 调用DBMS_SCHDULER.CREATE_JOB过程直接指定 (下面会详细说明)
在创建一个计划时,你至少需要指定下面的属性,它们是job运行所必须的:
开始时间 (start_time);
重复频率 (repeat_interval);
结束时间 (end_time)
另外,对于一个job而言,还有很多的附加参数:
job_class
job_priority
auto_drop
restartable
......
Oracle数据库10g schedule job的常用操作:
-- job 权限
grant create job to somebody;
-- job 创建
begin
dbms_scheduler.create_job (
job_name => 'AGENT_LIQUIDATION_JOB',
job_type => 'STORED_PROCEDURE',
job_action => 'AGENT_LIQUIDATION.LIQUIDATION', --存储过程名
start_date => sysdate,
repeat_interval => 'FREQ=MONTHLY; INTERVAL=1; BYMONTHDAY=1;BYHOUR=1;BYMINUTE=0;BYSECOND=0', -- 按月,间隔为1个(月),每月1号,凌晨1点
comments => '执行代理商清分程序'
);
end;
/
-- job 执行时间测试
DECLARE
start_date date;
return_date_after date;
next_run_date date;
BEGIN
start_date := sysdate;--to_timestamp_tz('10-OCT-2004 10:00:00','DD-MM-YYYY HH24:MI:SS');
return_date_after := start_date;
FOR i IN 1..10 LOOP
DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('FREQ=MONTHLY; INTERVAL=1; BYMONTHDAY=1;BYHOUR=1;BYMINUTE=0;BYSECOND=0',start_date, return_date_after, next_run_date);
DBMS_OUTPUT.PUT_LINE('next_run_date: ' || to_char(next_run_date,'yyyy-mm-dd HH24:M ......
所谓出于job而胜于job,说的就是Oracle 10g后的新特性Scheduler啦。在10g环境中,ORACLE建议使用Scheduler替换普通的job,来管理任务的执行。其实,将Scheduler描述成管理job的工具已经太过片面了,10G版本中新增的Scheduler绝不仅仅是创建任务这么简单。。。。
提示:ORACLE中管理Scheduler是通过DBMS_SCHEDULER包,本章也以此为切入点,通过详细介绍DBMS_SCHEDULER包的使用,来演示如何使用Scheduler。似乎本末倒置了,没关系,"三思笔记",俺的地盘俺做主。
一、使用Jobs
所谓JOBS,其实就是Scheduler管理的一个(或多个)任务的执行调度。
1.1 创建Jobs
通过DBMS_SCHEDULER包来创建Jobs,是使用其CREATE_JOB过程。在创建Job时,用户可以指定要执行的任务,调度信息(啥时候执行,执行周期,终止日期等)以及其它一些任务相关的属性。CREATE_JOB过程调用还是比较简单的,例如:
SQL> BEGIN
2 DBMS_SCHEDULER.CREATE_JOB (
3 job_name => 'INSERT_TEST_TBL',
4 job_type => 'STORED_PROCEDURE',
5 job_action => ' P_ INSERT INTOTEST ',
6 start_date => sysdate,
......
1.2 管理Jobs
1.2.1 启用Jobs
前面创建JOB时,由于未显式的指定ENABLED参数,因此即使指定了START_DATE,不过默认情况下JOB不会自动执行。对于这种情况,DBMS_SCHEDULER包中提供了一个过程ENABLE,可以用来修改JOB的启用状态,调用方式非常简单,例如:
SQL> exec dbms_scheduler.enable(¨INSERT_TEST_TBL¨);
PL/SQL procedure successfully completed.
1.2.2 禁用Jobs
DBMS_SCHEDULER.ENABLE 仅用来将JOB(其实不仅仅对JOB有效,对于CHAIN、PROGRAM等也有效)的启用状态置为TRUE。如果想将其启用状态置为FALSE?简单,还有一个与该功能对应的过程:DBMS_SCHEDULER.DISABLE,例如:
SQL> exec dbms_scheduler.disable(¨INSERT_TEST_TBL¨);
PL/SQL procedure successfully completed.
这两个过程仅用来重置对象的状态,因此均可以无限次执行,即使执行时对象已经被置为要指定的状态。
1.2.3 修改Jobs
由于JOB的属性众多,难免时不时的可能会遇到需要修改的情况,比如说前面创建JOB时不小心,指定要执行的过程名输入错误(完全有可能,CREATE_JOB在创建时不会自动检查指定的过程是否有效,从这方面考虑,SCHEDULER不如普通 ......