您的位置:首页 > 数据库

使用DBMS_SHARED_POOL包将PL/SQL大对象保存到Shared Pool

2011-10-11 16:32 411 查看
当系统在加载PL/SQL大对象时,有可能遭遇由于Shared Pool中存在大量碎片导致没有足够空间加载的问题。

我们可以将那些经常被使用的PL/SQL大对象预先保存到Shared Pool中,防止加载失败以及经常被换出,提高系统运行效率。

1.创建存储过程初始化测试环境

这里使用文章《【PL/SQL】向表中插入连续数字之PL/SQL方法》(http://space.itpub.net/519536/viewspace-696181)中提供的方法创建一个简单的存储过程用于测试。

注:实际生产环境中,该方法用于保存PL/SQL大对象,而非本例中给出的样例存储过程。

sys@ora10g> conn sec/sec

Connected.

sec@ora10g> create or replace procedure p_insert

2 is

3 begin

4 for i in 1..10 loop

5 insert into t values(i);

6 end loop;

7 commit;

8 end;

9 /

Procedure created.

2.创建DBMS_SHARED_POOL包

系统默认情况下不会创建dbms_shared_pool这个包。我们可以使用dbmspool.sql脚本进行手工创建。

1)验证默认情况下DBMS_SHARED_POOL包未创建

sys@ora10g> desc dbms_shared_pool

ERROR:

ORA-04043: object dbms_shared_pool does not exist

2)执行创建DBMS_SHARED_POOL包脚本

sys@ora10g> @?/rdbms/admin/dbmspool.sql

Package created.

Grant succeeded.

View created.

Package body created.

3)查看创建成功的DBMS_SHARED_POOL包

sys@ora10g> desc dbms_shared_pool

PROCEDURE ABORTED_REQUEST_THRESHOLD

Argument Name Type In/Out Default?

------------------------------ ----------------------- ------ --------

THRESHOLD_SIZE NUMBER IN

PROCEDURE KEEP

Argument Name Type In/Out Default?

------------------------------ ----------------------- ------ --------

NAME VARCHAR2 IN

FLAG CHAR IN DEFAULT

PROCEDURE SIZES

Argument Name Type In/Out Default?

------------------------------ ----------------------- ------ --------

MINSIZE NUMBER IN

PROCEDURE UNKEEP

Argument Name Type In/Out Default?

------------------------------ ----------------------- ------ --------

NAME VARCHAR2 IN

FLAG CHAR IN DEFAULT

我们这里关注DBMS_SHARED_POOL包中的KEEP和UNKEEP方法。

3.使用DBMS_SHARED_POOL包将存储过程保存到Shared Pool

1)确认存储过程P_INSERT是否被保存到Shared Pool

可以通过查询v$db_object_cache视图获得这方面的信息。

sys@ora10g> col owner for a10;

sys@ora10g> col name for a30;

sys@ora10g> col kept for a4

sys@ora10g> select owner,name,type,kept from v$db_object_cache where name='P_INSERT';

OWNER NAME TYPE KEPT

---------- ------------------------------ -------------------- ----

SEC P_INSERT PROCEDURE NO

最后一列KEPT表明存储过程P_INSERT此时没有被保存到Shared
Pool。

2)保存存储过程P_INSERT到Shared Pool

由于存储过程p_insert是创建在sec用户下,我们可以使用如下方法将该存储过程保存到Shared Pool中。

sys@ora10g> exec dbms_shared_pool.keep('SEC.P_INSERT','P');

PL/SQL procedure successfully completed.

3)在此确认存储过程P_INSERT是否被保存到Shared
Pool

sys@ora10g> select owner,name,type,kept from v$db_object_cache where name='P_INSERT';

OWNER NAME TYPE KEPT

---------- ------------------------------ -------------------- ----

SEC P_INSERT PROCEDURE YES

最后一列KEPT表明存储过程P_INSERT此时已被保存到Shared
Pool。

4.使用DBMS_SHARED_POOL包解除Shared Pool中保存的存储过程

我们这里使用UNKEEP方法可以解除Shared Pool中保存的存储过程。

sys@ora10g> exec dbms_shared_pool.unkeep('SEC.P_INSERT','P');

PL/SQL procedure successfully completed.

sys@ora10g> select owner,name,type,kept from v$db_object_cache where name='P_INSERT';

OWNER NAME TYPE KEPT

---------- ------------------------------ -------------------- ----

SEC P_INSERT PROCEDURE NO

解除成功。

原文地址:http://space.itpub.net/519536/viewspace-696189
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: