周大师的书中说软软解析的核心原理就是通过设置session_cached_cursors参数,将某个会话中常用的SQL放入UGA的会话缓冲区去,当会发发起相同的SQL时,可以快速的从UGA取得CURSOR的信息,从而减少共享池的争用,当一个CURSOR被解析3次以上(包括3次)时就会被放入到UGA会话缓冲区中。下面是实验过程:
SQL> select * from v$version where rownum<2;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit
首先查询出LIBRARY CACHE LATCH的内存地址如下:
SQL> select 'oradebug poke 0x' || addr || ' 1 0x01'
2 from v$latch_children where name='library cache';
'ORADEBUGPOKE0X'||ADDR||'10X01'
---------------------------------------
oradebug poke 0x0000000077947860 1 0x01
测试一:library cache latch对硬解析的影响:
会话1:用oradebug工具手动的持有library cahe lacth
SQL> oradebug setmypid
Statement processed.
SQL> oradebug poke 0x0000000077947860 1 0x01
BEFORE: [077947860, 077947864) = 00000000
AFTER: [077947860, 077947864) = 00000001
会话2:进行硬解析直接挂起,如下:
SQL> select count (*) from dba_ojbects;--直接挂起
------------------------------------------------------------------------------------
测试二:library cache latch对软解析的影响:
会话1:
先进行硬解析,如下:
SQL> select count(*) from dba_objects;
COUNT(*)
----------
50611
会话2:
用oradebug工具手动的持有library cache lacth
SQL> oradebug setmypid
Statement processed.
SQL> oradebug poke 0x0000000077947860 1 0x01
BEFORE: [077947860, 077947864) = 00000000
AFTER: [077947860, 077947864) = 00000001
会话1:
SQL> select count(*) from dba_objects;
COUNT(*)
----------
50611
SQL> /----仍然挂起
---------------------------------------------------------------------------------------
测试三:library cache latch对软软解析的影响:
会话1:
先执行3次解析,那么第四次就会进行软软解析,如下:
SQL> select count(*) from dba_objects;
COUNT(*)
----------
50611
SQL> /
COUNT(*)
----------
50611
SQL> /
COUNT(*)
----------
50611
用oradebug工具手动的持有library cahe lacth
SQL> oradebug setmypid
Statement processed.
SQL> oradebug poke 0x0000000077947860 1 0x01
BEFORE: [077947860, 077947864) = 00000000
AFTER: [077947860, 077947864) = 00000001
会话1:
在进行第4次解析的时候可以继续执行SQL,并且不在需要library cache latch,从而验证了文章开头说的话。
注:oradebug工具的使用:http://blog.youkuaiyun.com/tianlesoftware/article/details/6525628