oracle引數-cursor_sharing

guyuanli發表於2008-07-30
cursor_sharing:說明: 控制可以終止共享相同的共享遊標的 SQL 語句型別。值範圍:強制: 強制表達方式不同但語句意思相同的語句共享一個遊標。
EXACT:
只令完全相同的 SQL 語句共享一個遊標。預設值: EXACT
[@more@]

cursor_sharing:說明: 控制可以終止共享相同的共享遊標的 SQL 語句型別。值範圍:強制: 強制表達方式不同但語句意思相同的語句共享一個遊標。
EXACT:
只令完全相同的 SQL 語句共享一個遊標。預設值: EXACT

若存在欄位的 histograms ,則每次是不同的值的時候都產生硬解析 ,若不存在 histograms,則不產生硬解析。換句話說,當表的欄位被分析過存在histograms的時候,similar 的表現和exact一樣,當表的欄位沒被分析,不存在histograms的時候,similar的表現和force一樣。

這樣避免了一味地如force一樣轉換成變數形式,因為有histograms的情況下轉換成變數之後就容易產生錯誤的執行計劃,沒有利用上統計資訊。exact呢,在沒有histograms的情況下也要分別產生硬解析,這樣的話,由於執行計劃不會受到資料分佈的影響(因為沒有統計資訊)重新解析是沒有實質意義的。而similar則綜合了兩者的優點。

如果應用程式沒有使用繫結變數,而且修改應該程式的代價很大,那麼有時候採用折中的方式,在Oracle上設定CURSOR_SHARINGFORCE。這樣強制系統採用繫結變數。但是將引數設定為FORCE會導致很多的問題

Oracle9i開始,CURSOR_SHARING的值增加了一個SIMILAROracle推薦使用SIMILAR來代替FORCE,當引數設定為SIMILAR時,Oracle不會強制將全部的變數進行繫結,而是根據一些預定義的設定進行判斷。

無論是FORCE引數還是改進後的SIMILAR引數,都是解決繫結變數的替代方式,這些方式都可能帶來一些bug以及很多未知的東西。只有有可能就應該透過修改程式的方法去設定繫結變數。

案例:問題:在程式中select某個表的資料很慢,但是相關的sqlsql*plus中卻非常快就出來了。分析:1.檢察欄位索引(無問題)
2.
執行計劃判斷有誤(DBMS_STATS
3.CURSOR_SHARING
Oracle強制繫結變數,而且這樣作會減少很多CPU負荷,因為它減少了SQL的重複硬解析次數)

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

相關文章