cursor:pin S wait on X
什么是cursor:pin S wait on X 等待事件?
当一个会话尝试得到一个mutex pin的时候,但是其他会话正在以exclusive模式持有相同cursor object的mutex,此时申请mutex pin的会话等待事件即为cursor:pin S wait on X 。
造成该等待事件的原因:
1.shared pool设置太小,或者由于自动内存管理导致的。
2.频繁的硬解析
3.子游标太多
4.BUG
5.解析错误
关于解析错误,可以通过设置10035事件开启记录解析错误的sql到alert.log中。
ALTER SYSTEM SET EVENTS '10035 trace name context forever, level 1';
如何定位问题会话和sql呢?
首先通过v$event_name查看p1 p2 p3含义:
SYS@cdbtest1(CDB$ROOT)> set line 100
SYS@cdbtest1(CDB$ROOT)> select PARAMETER1,PARAMETER2,PARAMETER3 from v$event_name where name='cursor: pin S wait on X';
PARAMETER1 PARAMETER2 PARAMETER3
------------------------------ ------------------------------ ------------------------------
idn value where
p1值是Mutex identifier,与sql的hash value匹配可以得到具体的sql,可以用下面的sql查询,注意不要填成了p1raw值。
SELECT sql_id, sql_text, version_count
FROM V$SQLAREA where HASH_VALUE='000000001A27969A';
p2值是Mutex value。高8位包含了持有mutex的会话的sid信息,也就是holder的sid;低8位是reference count值,如果都是0的话,那么证明该持有者以X模式持有。比如p2raw:0000005200000000
SELECT decode(trunc(0000005200000000/4294967296),
0,trunc(0000005200000000/65536),
trunc(0000005200000000/4294967296)) SID_HOLDING_MUTEX
FROM dual; 郑州不孕不育医院哪家好:http://jbk.39.net/yiyuanzaixian/zztjyy/
352187318272
21474836480
p3值是被请求的mutex的地址,可以用下面的sql查询
SELECT MUTEX_TYPE, LOCATION
FROM x$mutex_sleep
WHERE mutex_type like 'Cursor Pin%'
and location_id in (
SELECT decode(trunc(&&P3/4294967296),
0,trunc(&&P3/65536),
trunc(&&P3/4294967296)) LOCATION_ID
FROM dual);