cursor: pin S wait on X等待事件。

select * from v$version;
BANNER
------------------------------------------------------------------------------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
PL/SQL Release 11.1.0.7.0 - Production
CORE    11.1.0.7.0      Production
TNS for Linux: Version 11.1.0.7.0 - Production
NLSRTL Version 11.1.0.7.0 - Production


先创建一张测试表。
create table wxh_tbd as select * from dba_objects;

Table created.

create index t1 on wxh_tbd(object_id);

Index created.

同时在session1,和session2执行如下语句,在session3观察等待事件:
session1语句):
select sid from v$mystat where rownum=1;

       SID
----------
      1058

declare
  s varchar2(100) := 'alter system flush shared_pool';
  sql_text     varchar2(200);
begin
  FOR j IN 1 .. 300 loop
    execute immediate s;
    for i in 1 .. 100 loop
      sql_text := 'select object_id from wxh_tbd where object_id=' || i;
      execute immediate sql_text;
    end loop;
  end loop;
end;
/

session2的语句):
select sid from v$mystat where rownum=1;

       SID
----------
      1248

declare
  s varchar2(100) := 'alter system flush shared_pool';
  sql_text     varchar2(200);
begin
  FOR j IN 1 .. 300 loop
    execute immediate s;
    for i in 1 .. 100 loop
      sql_text := 'select object_id from wxh_tbd where object_id=' || i;
      execute immediate sql_text;
    end loop;
  end loop;
end;
/

session3的语句:
select b.*, sq.sql_text
  from v$session se,
       v$sql sq,
       (select a.*, s.sql_text
          from v$sql s,
               (select sid sid1,
                       event,
                       wait_class,
                       p1,
                       p2raw,
                       to_number(substr(p2raw,1,8),'xxxxxxxx') sid2
                  from v$session_wait
                 where event like 'cursor%') a
         where s.HASH_VALUE = a.p1) b
where se.sid = b.sid1
   and se.sql_hash_value = sq.hash_value;
   
如果不知道这个SQL什么意思,看看官方文档对p1,p2参数的解释,你就差不多理解了。就是想找到获得X锁的会话执行的SQL,和需要获得S锁的会话正在执行的SQL.并且查出他们的SQL文本和等待事件。
cursor: pin S wait on XA session waits for this event when it is requesting a shared mutex pin and another session is holding an exclusive mutex pin on the same cursor object.
Wait Time: Microseconds
ParameterDescriptionP1 Hash value of cursorP2 Mutex value (top 2 bytes contains SID holding mutex in exclusive mode, and bottom two bytes usually hold the value 0)P3 Mutex where (an internal code locator) OR'd with Mutex Sleeps session3的输出如下图,你每次点击,基本都能出现这个等待事件,而且两个session的文本是一样的(图如果不清晰,直接点击打开):

20101205_10b16d37705ff64eb0e9VzPdOY7059j1.jpg
7e78c1e904cbccd55d09fa4ec4b279b6.jpg


刚做这个实验的时候,我并没有通过session3的语句去专一的查cursor: pin S wait on X.而是在pl/sql developer里快速的点击查询按钮,观察等待事件(比较等级哈):
select * from v$session_wait where wait_class<>'Idle';
基本上等待事件都是cursor: pin S wait on X  和shared pool latch。后者是用来为sql 的执行计划分配内存的。有了这样的经验后,才通过session3的语句看cursor: pin S wait on X 等待的session都在干什么,拿我这个实验为例,就是sid为1058的已经获得了X锁正在对SQL进行解析,这个时候有另一个session也想要对同一个SQL进行解析,那么就会产生等待事件cursor: pin S wait on X 。看来cursor: pin S wait on X 等待是由于有N个session 要对同一个sql解析导致的,而ORACLE 只把解析的任务给第一个SESSION,其他session 就等待吧,直到解析完成,他们共享解析成果就行了。




那10G下的实验又会如何呢?

SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production


实验步骤我就不写了,跟上面差不多,session3的语句就不用执行了,因为这个等待时间根本不会出现,你就低级点,在PL/SQL里狂点查询的鼠标吧。
select * from v$session_wait where wait_class<>'Idle';
等待事件除了shared pool latch外,基本都是library cache pin了。

看来就SQL解析层面来说,cursor: pin S wait on X取代了10G之前的library cache pin。



[ 本帖最后由 wei-xh 于 2010-12-5 17:30 编辑 ]

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

转载于:http://blog.itpub.net/22034023/viewspace-680938/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值