Parent-Child cursor (父子遊標)
父遊標:只要SQL語句文本相同,它們就對應 同一個parent cursor。
子遊標:在某些情況下,雖然SQL語句的文本相同,但是因為其它 因素不同(這些因素可以在視圖V$SQL_SHARED_CURSOR中查看),導致產生不同的child cursor。(重建child cursor,也就意味著一次硬解析)
cursor_sharing
對 於是否使用綁定變數這個問題,最好是交給應用程式決定,在資料庫層面是很難正確判斷。 (這也是為什麼cursor_sharing參數預設值為exact)
但是,有些時候,由於應用程式沒 有正確使用綁定變數,導致資料庫效能問題,又因為此時系統已上線,要改應用代碼有很多 的阻力(大多都是人為的因素)。為此,Oracle提供了應急(事後補救)方案,可以在資料 庫層級強制使用綁定變數。
當cursor_sharing=force時,對於只有謂詞條件不一樣的SQL 陳述式,Oracle統統都認為是一樣的。但是這樣會有一個問題,就是可能後續的執行計畫不是 最優。為瞭解決這個問題,可以設定cursor_sharing=similar,這樣如果謂詞條件的變化可 能產生不同的執行計畫,Oracle都會進行硬解析(產生child cursor)。
但是,設定 cursor_sharing=similar要非常小心,因為有很多bug,需要經過充分的測試才能在生產庫上 修改。
Bind Peeking (變數窺視)
從Oracle9i開始,Oracle在第一次解析SQL (hard parse)時,如果SQL上有變數綁定,會查看這個變數的值,以便於更準確的指定執行計 劃;但在後續的分析中(soft parse),將不會理會這個變數的值。
適用情境
執行計畫幾乎不改變(oltp)
大量的並發
大量的除謂詞外幾乎相同的SQL。
不適用情境
執行計畫會隨變數值的變化而改變。
少量的SQL (OLAP).
ACS (Adaptive Cursor Sharing)
Oracle11g用於解決變數綁定帶來的 負面影響,通過不斷觀察bind的值,來決定新的SQL是否重用之前的執行計畫,解決綁定變數 導致後續執行計畫不變的問題。
缺點
更多的硬分析
產生更多的子遊標,需 要更多的記憶體。
消耗更多的CPU
綁定變數的適用情境
適用於OLTP
用 戶並發很高
表中有主鍵
操作的資料少
執行計畫穩定
SQL的重複率高
不適 用於OLAP
執行計畫多變
並發使用者少
SQL解析對系統效能影響小
返回欄目頁:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/