此參數的作用
根據文檔或者X$KSPPI中的描述,該參數用來限制字典緩存管理可以緩存在共享池中的共享游標數量。但是通常在V$SQLAREA上一個簡單的查詢可以顯示事實上并沒有這個限制行緩存游標在共享池中并沒有特別的處理。
事實上,該參數限制一個進程在調用期間行緩存游標的私有SQL區域的數量。并且這個私有SQL區的緩存,或者共享游標實例化,是由PGA而不是UGA控制的。_row_cache_cursors參數設置持久PGA內存中的數組數量,數組中的每個槽需要28個字節。該值過小會導致不必要的軟解析,過大的值則會浪費每個Oracle服務器進程中pga的內存。并且可能會減少其他游標的緩存。
調整方法
Oracle在X$KQDPG中為行緩存游標的私有sql區緩存保持了一些統計。該表報告了緩存限制,需要行緩存游標的次數,需要實例化的次數,以及緩存溢出的次數。如果緩存太小就會發生溢出,否則就是足夠大。通常需要的并發緩存行游標數依賴于調用的延遲時間和復雜性,對于長運行的引用大量dd對象的pl/sql過程,最可能獲益于增加行緩存游標實例化。
但是X$KQDPG的缺點是其是進程依賴的,并且不能查詢其他進程,因此需要統計那些有代表性的應用程序進程,而不是用來監控性能的進程的統計。
不過另一種方法是:X$KQDPG后面的數據結構是fixed PGA,可以很容易的使用level 1 global_area得到有代表性的進程dump其fixed PGA到跟蹤文件(使用ORADEBUG或DBMS_SYSTEM.SET_EV調用) 。然后在那里查找kqdpga_數據結構,跳過12個字節,然后讀取16進制返回值。
假如發現溢出,你可以選擇增加 _row_cache_cursors的值,在這些值上的很小的增加通常能夠有效的防止溢出并且不會產生過多的影響。
新聞熱點
疑難解答