open_cursors參數設置調優


ORACLE服務端CACHING CURSOR的功能,我們稱為軟關閉,即使你隱式關閉游標、或者close cursor也不會真正硬關閉這個游標,以便下次執行相同語句時,不需要重復打開。
對於臨時游標,下次調用不同語句時就被硬關閉,但是對於存儲對象中的游標(SQL),那么通常只有在OPEN CURSOR滿才會去硬關閉。
這里的OPEN CURSOR滿是什么意思?怎么才算滿? show parameter open_cursor,達到這個數就算滿了。

下面這個SQL可以看出所有會話當前打開游標的數量:

select sid,value from v$sesstat a , v$statname b 
where a.statistic# = b.statistic# and name='opened cursors current' order by 2; 

在一般人的眼里,游標使用后就關閉了,打開的游標的數量應該不會太多,實際上,大部分人對打開游標的概念一直存在誤解,認為只有正在獲取的游標是打開狀態,而一旦獲取結束,關閉游標后,游標就處於關閉狀態了,因此一個會話中打開狀態的游標數量應該很少。 

現在我們都知道事實不是這樣的,某些游標在程序中已經關閉了,但是oracle為了提高游標的性能,會對其進行緩沖(cache),這些緩沖的游標在程序中的關閉只是一種軟關閉,事實上在會話中並未關閉,而是存放在一個游標緩沖區中。

1)在9.2.0.5之前,open_cursors參數的作用是雙重的,一方面是限制一個會話打開游標的總量,另外一方面,該參數也作為PL/SQL cursor的緩沖。
    在PL/SQL中,如果某個游標關閉了,它不會馬上硬關閉,而是首先保存在游標緩沖中。
    如果這個會話打開的游標數量還沒有達到open_cursors參數的值,那么就可以先保持打開狀態。
    如果當前打開的游標數量已經達到open_cursors參數的值,那么會首先關閉一個被緩沖的、實際當時並未打開的游標。
    如果緩沖中的所有游標都是實際打開的,那么就會報ORA-1000錯誤:ORA-1000:maximum open cursors exceeded.

2)當然,在9.2.0.5之后,open_cursors參數不再承擔PL/SQL的緩沖工作,PL/SQL中的SQL也可以使用session_cached_cursors的會話緩沖了。
    這個參數就成了一個純碎的限制。
    但是,設置一個較大的open_cursors參數,可以避免出現ORA-1000錯誤,同時也可以讓會話緩沖更多的游標,改善SQL解析的性能。
    不過將這個參數設置得很大的話,會占用較多的PGA空間,消耗一定的物理內存。一般的OLTP系統中,800--3000就足夠了,很少有超過3000的設置.
    不過具體還是要看你的應用 為什么當前有這么多打開的游標數量。

增大游標的值:alter system set open_cursors = 加大的值;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM