ITPub博客

首页 > 应用开发 > IT综合 > library cache pin(3)

library cache pin(3)

原创 IT综合 作者:jss001 时间:2009-02-19 20:40:37 0 删除 编辑

其他解决方法

当重新编译某个package时,应确认当前没有session在使用此package中的object. 当我们重新编译某个package时,如果有session正在执行此package中的procedure或function,那么编译就会挂起. 因为编译或分析(parse)package或procedure或function或view时,Oracle需要先取得”library cache lock”和”library cache pin”以保证在编译或分析(parse)期间没有session正使用此object – 因为我们正修改此object的定义并需要删除后用新的定义来重建此object.

我们可以用以下procedure来检查是否有session正在使用某个package,如果此procedure有结果返回,则此时不能编译此package,

sql> Connect SYS

password:

sql> set serveroutput on

sql>create or replace procedure who_is_using(obj_name varchar2) is

begin

dbms_output.enable(1000000);

for i in (SELECT distinct b.username,b.sid

FROM SYS.x$kglpn a,v$session b,SYS.x$kglob c

WHERE a.KGLPNUSE = b.saddr

and upper(c.KGLNAOBJ) like upper(OBJ_NAME)

and a.KGLPNHDL = c.KGLHDADR) loop

dbms_output.put_line('('||to_char(i.sid)||') - '||i.username);

end loop;

end;

sql>execute who_is_using('my_package%');

(14) – SCOTT #即scott用户正在执行 my_package

以下查询可得到正使用此package的session是否正占着”library cache pin”锁或正等待”library cache pin”锁:

sql>SELECT a.KGLPNMOD, a.KGLPNREQ, b.username, c.KGLNAOBJ,

c.KGLOBTYP

FROM

x$kglpn a,

v$session b,

x$kglob c

WHERE

a .KGLPNUSE = b.saddr and

upper(c.KGLNAOBJ) like upper('%my_package%') and

a.KGLPNHDL = c.KGLHDADR;

与LIBRARY CACHE PIN相关的参数

在OPS 8.1.5, 8.1.6和8.1.7.0中,一定要在initsid.ora文件中设置

_SQLEXEC_PROGRESSION_COST=0以避免因session等待”library cache pin”而造成的数据库性能严重下降或数据库挂起.

结束语

以上介绍了”library cache pin”的定义,产生原因及对数据库性能的影响,给出了详

细的分析步骤和解决方法,本文适合较有经验的数据库管理员阅读.

本文中给出的SQL语句请先测试后才能使用.

[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/18921899/viewspace-1017598/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: library cache pin(2)
下一篇: oracle cache table(1)
请登录后发表评论 登录
全部评论
  • 博文量
    306
  • 访问量
    871814