Oracle開發(fā)技術(shù):[Oracle]變量綁定
[Oracle]變量綁定
Parent-Child cursor (父子游標(biāo))
父游標(biāo):只要SQL語句文本相同,它們就對(duì)應(yīng)同一個(gè)parent cursor。
子游標(biāo):在某些情況下,雖然SQL語句的文本相同,但是因?yàn)槠渌蛩夭煌?這些因素可以在視圖V$SQL_SHARED_CURSOR中查看),導(dǎo)致產(chǎn)生不同的child cursor。(重新生成child cursor,也就意味著一次硬解析)
cursor_sharing
對(duì)于是否使用綁定變量這個(gè)問題,最好是交給應(yīng)用程序決定,在數(shù)據(jù)庫(kù)層面是很難正確判斷。(這也是為什么cursor_sharing參數(shù)默認(rèn)值為exact)
但是,有些時(shí)候,由于應(yīng)用程序沒有正確使用綁定變量,導(dǎo)致數(shù)據(jù)庫(kù)性能問題,又因?yàn)榇藭r(shí)系統(tǒng)已上線,要改應(yīng)用代碼有很多的阻力(大多都是人為的因素)。為此,Oracle提供了應(yīng)急(事后補(bǔ)救)方案,可以在數(shù)據(jù)庫(kù)級(jí)別強(qiáng)制使用綁定變量。
當(dāng)cursor_sharing=force時(shí),對(duì)于只有謂詞條件不一樣的SQL語句,Oracle統(tǒng)統(tǒng)都認(rèn)為是一樣的。但是這樣會(huì)有一個(gè)問題,就是可能后續(xù)的執(zhí)行計(jì)劃不是最優(yōu)。為了解決這個(gè)問題,可以設(shè)置cursor_sharing=similar,這樣如果謂詞條件的變化可能生成不同的執(zhí)行計(jì)劃,Oracle都會(huì)進(jìn)行硬解析(生成child cursor)。
但是,設(shè)置cursor_sharing=similar要非常小心,因?yàn)橛泻芏郻ug,需要經(jīng)過充分的測(cè)試才能在生產(chǎn)庫(kù)上修改。
Bind Peeking (變量窺視)
從Oracle9i開始,Oracle在第一次解析SQL(hard parse)時(shí),如果SQL上有變量綁定,會(huì)查看這個(gè)變量的值,以便于更準(zhǔn)確的指定執(zhí)行計(jì)劃;但在后續(xù)的分析中(soft parse),將不會(huì)理會(huì)這個(gè)變量的值。
適用場(chǎng)景
執(zhí)行計(jì)劃幾乎不改變(oltp)
大量的并發(fā)
大量的除謂詞外幾乎相同的SQL。
不適用場(chǎng)景
執(zhí)行計(jì)劃會(huì)隨變量值的變化而改變。
少量的SQL(OLAP).
ACS (Adaptive Cursor Sharing)
Oracle11g用于解決變量綁定帶來的負(fù)面影響,通過不斷觀察bind的值,來決定新的SQL是否重用之前的執(zhí)行計(jì)劃,解決綁定變量導(dǎo)致后續(xù)執(zhí)行計(jì)劃不變的問題。
缺點(diǎn)
更多的硬分析
產(chǎn)生更多的子游標(biāo),需要更多的內(nèi)存。
消耗更多的CPU
綁定變量的適用場(chǎng)景
適用于OLTP
用戶并發(fā)很高
表中有主鍵
操作的數(shù)據(jù)少
執(zhí)行計(jì)劃穩(wěn)定
SQL的重復(fù)率高
不適用于OLAP
執(zhí)行計(jì)劃多變
并發(fā)用戶少
SQL解析對(duì)系統(tǒng)性能影響小