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的文本是一样的(图如果不清晰,直接点击打开):
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 编辑 ]
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的文本是一样的(图如果不清晰,直接点击打开):
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/