cursor:pin s wait x
最近在晚上3点左右账务d会报cursor:pin s wait x的性能问题,收集了awr和ash报告信息。
ASH信息:
时间从31-03-2012 02:57:40到31-03-2012 03:12:40,时间间隔为15分钟。
AWR中信息:
正常时的解析情况:
出现cursor:pin s wait x时的解析情况:
从会话历史信息中找
sid sql_id status event p1 p2
-------- -------------- ---------- ----------------------- ---------- ----------
6141 d1462k206jkd4 WAITING library cache lock 5.04403211
6310 d1462k206jkd4 WAITING library cache lock 5.04403211
6368 d1462k206jkd4 WAITING library cache lock 5.04403211
6430 d1462k206jkd4 WAITING library cache lock 5.04403211
4623 d1462k206jkd4 WAITING library cache lock 5.04403211
4474 d1462k206jkd4 WAITING library cache lock 5.04403211
6430 d1462k206jkd4 WAITING library cache lock 5.04403211
4888 d1462k206jkd4 WAITING library cache lock 5.04403211
5097 d1462k206jkd4 WAITING library cache lock 5.04403211
5097 d1462k206jkd4 WAITING cursor: pin S wait on X 2154351012 20993800142848
5097 d1462k206jkd4 WAITING cursor: pin S wait on X 2154351012 20993800142848
5175 d1462k206jkd4 WAITING cursor: pin S wait on X 2154351012 20993800142848
5277 d1462k206jkd4 WAITING cursor: pin S wait on X 2154351012 20993800142848
sql_id:d1462k206jkd4的sql_text如下:
select * from (select ROWID, t.*
from I_USER_OS_PS_575 t
where mod(USER_ID, :"SYS_B_0") = :"SYS_B_1"
and STATUS = :"SYS_B_2"
and insert_date between trunc(sysdate - :"SYS_B_3") andsysdate
order by insert_date asc)
where :"SYS_B_4" =:"SYS_B_5"
and rownum <= :"SYS_B_6"
select所涉及的对象和insert的对象一致,查找mutex x holder的sid。根据cursor: pin S wait on X事件的P2参数得到holder的sid为4888。
相应的语句也发生在对象I_USER_OS_PS_575或者I_USER_OS_PS_573上面。
发现awr中hard parse数量相比增加,猜测是某种操作导致这个对象上的游标失效,导致所有相关语句发生硬解析,才会出现cursor: pin S wait on X。
于是做如下查询来验证:
object_name last_ddl_time
------------------ ----------------
I_USER_OS_PS_575 2012-4-1 3:02
I_USER_OS_PS_575 2012-4-1 3:00
I_USER_OS_PS_575 2012-4-1 3:00
I_USER_OS_PS_575 2012-3-31 3:0
I_USER_OS_PS_575 2012-3-30 3:0
I_USER_OS_PS_575 2012-3-29 3:0
凌晨三点对此表做了某种ddl,导致游标失效,发生硬解析,经过和应用沟通得知,晚上3:00有一个作业,需要对这些分区表做Shrink。所以导致相关对象上的Cursor失效,硬解析严重。
查了下03:00:00有个job
PURGE_LOG 21-11月-06 03.00.00.600000
Select actual_start_date FromDBA_SCHEDULER_JOB_RUN_DETAILS
where job_name='PURGE_LOG';
31-3月 -12 03.00.00.056803 上午 UTC