open_cursors與session_cached_cursors

abstractcyj發表於2013-08-20
open_cursors: 該引數的含義是一個session同時開啟最多在使用的遊標數
session_cached_cursors: 說的是一個session最多可以快取多少個cursor, 讓後續的SQL語句不再開啟遊標,從而避免軟解析的過程來提高效能。
軟解析與硬解析都比較耗費資源。

以下SQL判斷session_cached_cursors的使用情況。如果為100%則增大這個引數值:
Select 'session_cached_cursors' Parameter,
    Lpad(Value, 5) Value,
    Decode(Value, 0, ' n/a', To_Char(100 * Used / Value, '990') || '%') Usage
From (Select Max(s.Value) Used
      From V$statname n, V$sesstat s
     Where n.Name = 'session cursor cache count'
      And s.Statistic# = n.Statistic#),
    (Select Value From V$parameter Where Name = 'session_cached_cursors')
Union All
Select 'open_cursors',
    Lpad(Value, 5),
    To_Char(100 * Used / Value, '990') || '%'
From (Select Max(Sum(s.Value)) Used
      From V$statname n, V$sesstat s
     Where n.Name In
        ('opened cursors current', 'session cursor cache count')
      And s.Statistic# = n.Statistic#
     Group By s.Sid),
    (Select Value From V$parameter Where Name = 'open_cursors');

當我們執行一個SQL時,我們將會在shared pool產生一個library cache object, cursor就是其中針對SQL的一種library cache object。另外我們在PGA會有一個cursor的拷貝,同時在客戶端有一個statement handle,這些都被稱為cursor。
在v$open_cursor裡我們可以看到當前開啟的cursor和PGA內的cached cursor。
sesseion_cached_cursor限制了在PGA內session cursor cache list的長度,session cursor cache list是一條雙向的LRU(Least Recently Used) 連結串列,當一個session打算關閉一個cursor時,如果這個cursor的parse count超過3次,那麼這個cursor將會被加到session cursor cache list的MRU端(Most Recently Used)。當一個session打算parse一個SQL時,它會先去PGA內搜尋session cursor cache list, 如果找到那麼會把這個cursor脫離list, 然後當關閉時再把這個cursor加到MRU端。session_cached_cursor提供了快速軟解析的功能,提供了比soft parse更高的效能。



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

相關文章