遊標引數shared_cached_cursors和軟軟解析

dotaddjj發表於2011-11-24

繼續整理關於遊標 解析 繫結變數。這裡說下幾個引數,裡面內容有點深,自己也是迷迷糊糊的!

Oracle 10G

SQL> show parameter cursor;

NAME TYPE VALUE

cursor_sharing string EXACT

cursor_space_for_time boolean FALSE

open_cursors integer 300

session_cached_cursors integer 20

session_cached_cursors

一個sql語句會首先在uga中快取區存放與之關聯的遊標,然後開啟建立遊標 解析遊標 執行遊標 返回遊標 關閉遊標等。而一旦關閉這個session,這個uga中相關聯的session cursor就被釋放了。而session_cached_cursors引數標識的是一個session可以快取多個cursor數量,既是儲存在pgasql語句遊標的總數量,從而實現後續相同sql的軟軟解析。

軟軟解析:

Session cursor cache是一塊記憶體區域,儲存關閉了cursor,當一個cursor關閉之後,oracle檢查此cursor的請求是否超過三次,如果超過三次就會放入session cache cursor記憶體區域中,下次在parse的時候可以從session cursor cache直接呼叫,從而實現軟軟解析(session cache cursor的管理也是使用lRU演算法)

session_cached_cursors引數也就是session快取的cursor數量,控制了session cursor cache的大小,則值越大,相應的記憶體消耗也越大。

SQL> select name,value from v$sysstat where name like '%cursor%';

NAME VALUE

---------------------------------------------------------------- ----------

opened cursors cumulative 28899

opened cursors current 46

session cursor cache hits 21217

session cursor cache count 2865

cursor authentications 485

其中的session cursor cache hits就是軟軟解析的次數。

這裡摘要下http://www.cnblogs.com/rootq/archive/2009/08/27/1554748.html的對軟軟解析的解釋:

設定pga端的cache list的長度,當session_cached_cursors設定為0時,pgacache list長度為0,這時候當sga中的cursor關閉的時候它相關的library cache handlelock位被清0,從v$open_cursor裡看不到這個被關閉的cursor,它服從於shared poollru機制,當shared pool需要新的buffer空間時,它將會被flushshared pool

session_cached_cursors設定為非0值時,pgacache list長度為session_cached_cursors值的大小,同時pga cache list將會保留一份複製,這時候即使sga中的cursor關閉的時候它相關的library cache handle始終被加了null mode lock,當shared pool空間緊張時library cache handle始終將會被保留在shared pool.而新的應用訪問這個cursor的時候會直接去自己的pga cache list裡面搜尋

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1056520/,如需轉載,請註明出處,否則將追究法律責任。

相關文章