Oracle共享池管理-cursor: pin S

1 软软解析,堆6 在PGA中过于频繁,导致cursor: pin S

如果出现等待了,应该很可能就是该SQL执行的过于频繁。latch在Oracle中是一种低级锁,用于保护内存里的数据结构,提供的是串行访问机制,而mutex是Oracle 10gR2引入的,也是为实现串行访问控制的功能,并替换部分latch。

可以通过下面的SQL进行查询:

–查询sql
SELECT a.*, s.sql_text
FROM vKaTeX parse error: Double subscript at position 220: …') hold_mutex_x_̲sid F…session_wait
WHERE event LIKE ‘cursor%’) a
WHERE s.HASH_VALUE = a.p1

–Parameter说明
P1 Hash value of cursor

P2 Mutex value
64 bit platforms
8 bytes are used.
Top 4 bytes hold the session id (if the mutex is held X)
Bottom 4 bytes hold the ref count (if the mutex is held S).

32 bit platforms
4 bytes are used.
Top 2 bytes hold the session id (if the mutex is held X)
Bottom 2 bytes hold the ref count (if the mutex is held S).

P3 Mutex where (an internal code locator) OR’d with Mutex Sleeps
在每个child cursor下面都有一个mutexes这样的简单内存结构,当有session要执行该SQL而需要pin cursor操作的时候,session只需要以shared模式set这个内存位+1,表示session获得该mutex的shared mode lock.可以有很多session同时具有这个mutex的shared mode lock;但在同一时间,只能有一个session在操作这个mutext +1或者-1。+1 -1的操作是排它性的原子操作。如果因为session并行太多,而导致某个session在等待其他session的mutext +1/-1操作,则该session要等待cursor: pin S等待事件。

当看到系统有很多session等待cursor: pin S事件的时候,要么是CPU不够快,要么是某个SQL的并行执行次数太多了而导致在child cursor上的mutex操作争用。如果是硬件的问题,则可以升级硬件。

如果是SQL执行频率太高。最简单的做法是,将一条SQL拆分成多条SQL。增加SQL的版本数来降低并发。如一个SQL:

select name from acct where acctno=:1
可以改为如下4个SQL,则并发的争用可以下降4倍。

扫描二维码关注公众号,回复: 12740318 查看本文章
 select /*A*/ name from acct where acctno=:1
 select /*B*/ name from acct where acctno=:1
 select /*C*/ name from acct where acctno=:1
 select /*D*/ name from acct where acctno=:1

另外,我们还会经常碰到另外一个等待事件“cursor: pin S wait on X”,这个等待事件主要是由硬解析引起的,解释如下:
“cursor: pin S wait on X” wait event is mostly related to mutex and hard parse.

  • When a process hard parses the SQL statement, it should acquire exclusive
    library cache pin for the corresponding LCO.
  • This means that the process acquires the mutex in exclusive mode.
  • Another process which also executes the same query needs to acquire the mutex
    but it’s being blocked by preceding process. The wait event is “cursor: pin S wait on X”.

cursor: pin S,cursor: pin X,cursor: pin S wait on X这三个等待事件,实际上就是替代了cursor的library cache pin,pin S代表执行(share pin),pin X代表解析(exclusive pin),pin S wait on X代表执行正在等待解析操作。这里需要强调一下,它们只是替换了访问cursor的library cache pin,而对于访问procedure这种实体对象,依然是传统的library cache pin。

猜你喜欢

转载自blog.csdn.net/oradbm/article/details/108770108