??? 綁定變量是Oracle解決硬解析的首要利器,能解決OLTP系統(tǒng)中l(wèi)ibrary cache的過度耗用以提高性能。然刀子磨的太快,使起來鋒利,卻容
易折斷。凡事皆有利弊二性,因地制宜,因時(shí)制宜,全在如何權(quán)衡而已。本文講述了綁定變量的使用方法,以及綁定變量的優(yōu)缺點(diǎn)、使用場合。
?
一、綁定變量
??? 提到綁定變量,就不得不了解硬解析與軟解析。硬解析簡言之即一條SQL語句沒有被運(yùn)行過,處于首次運(yùn)行,則需要對其進(jìn)行語法分析,語
義識別,跟據(jù)統(tǒng)計(jì)信息生成最佳的執(zhí)行計(jì)劃,然后對其執(zhí)行。而軟解析呢,則是由于在library cache已經(jīng)存在與該SQL語句一致的SQL語句文本
、運(yùn)行環(huán)境,即有相同的父游標(biāo)與子游標(biāo),采用拿來主義,直接執(zhí)行即可。軟解析同樣經(jīng)歷語法分析,語義識別,且生成hash value ,接下來
在library cache搜索相同的hash value ,如存在在實(shí)施軟解析。有關(guān)更多的硬解析與軟解析以及父游標(biāo),子游標(biāo)請作如下參考:
???
??? 有關(guān)硬解析與軟解析,請參考:
Oracle 硬解析與軟解析
??? 有關(guān)父游標(biāo)、子游標(biāo),請參考:
父游標(biāo)、子游標(biāo)與共享游標(biāo)
???
??? 綁定變量
????? 首先其實(shí)質(zhì)是變量,有些類似于我們經(jīng)常使用的替代變量,替代變量使用&占位符,只不過綁定變量使用:
????? 替代變量使用時(shí)為 &variable_para,相應(yīng)的綁定變量則為 :bind_variable_para
????? 通常一個(gè)SQL語句包含動態(tài)部分和靜態(tài)部分,占位符實(shí)質(zhì)是SQL語句中容易發(fā)生變化的部分,通常為其條件或取值范圍。動態(tài)部分在一般情
????? 況下(數(shù)據(jù)傾斜除外),對執(zhí)行計(jì)劃的生成的影響是微乎其微的。故同一SQL語句不同的動態(tài)部分產(chǎn)生的執(zhí)行計(jì)劃都是相同的。
???????
二、綁定變量的使用
??? 1、在SQLPlus中使用綁定變量
??? 2、PL/SQL塊中使用綁定變量
??? 3、在存儲過程或包中使用綁定變量
??? 4、在動態(tài)SQL中是使用綁定變量????
???????
三、綁定變量的優(yōu)缺點(diǎn)及使用場合
??? 優(yōu)點(diǎn):
??????? 可以在library cache中共享游標(biāo),避免硬解析以及與之相關(guān)的額外開銷
??????? 在大批量數(shù)據(jù)操作時(shí)將呈數(shù)量級來減少閂鎖的使用,避免閂鎖的競爭
?????
??? 缺點(diǎn):
??????? 綁定變量被使用時(shí),查詢優(yōu)化器會忽略其具體值,因此其預(yù)估的準(zhǔn)確性遠(yuǎn)不如使用字面量值真實(shí),尤其是在表存在數(shù)據(jù)傾斜(表上的數(shù)
??????? 據(jù)非均勻分布)的列上會提供錯(cuò)誤的執(zhí)行計(jì)劃。從而使得非高效的執(zhí)行計(jì)劃被使用。
???
??? 使用場合:
??????? OLTP
??????????? 在OLTP系統(tǒng)中SQL語句重復(fù)執(zhí)行頻度高,但處理的數(shù)據(jù)量較少,結(jié)果集也相對較小,尤其是使用表上的索引來縮小中間結(jié)果集,其
??????????? 解析時(shí)間通常會接近或高于執(zhí)行時(shí)間,因此該場合適合使用綁定變量。
???????
??????? OLAP
??????????? 在OLAP系統(tǒng)中,SQL語句執(zhí)行次數(shù)相對較少,但返回的數(shù)據(jù)量較大,因此多數(shù)情況下傾向于使用權(quán)標(biāo)掃描更高效,其SQL語句執(zhí)行時(shí)
??????????? 間遠(yuǎn)高于其解析時(shí)間,因此使用綁定變量對于總響應(yīng)時(shí)間影響不大。而且增加生成低效執(zhí)行計(jì)劃的風(fēng)險(xiǎn)。即在在OLAP系統(tǒng)中使用字
??????????? 面量的性能高于使用綁定變量。
???
??? 注意:
??????? 對于實(shí)際的數(shù)據(jù)庫對象,如(表,視圖,列等),不能使用綁定變量替換,只能替換字面量。如果對象名是在運(yùn)行時(shí)生成的,則需要對其
??????? 用字符串拼接,同時(shí),sql只會匹配已經(jīng)在共享池中相同的對象名。
?
四、相關(guān)參考
???
Oracle 硬解析與軟解析
???
???
父游標(biāo)、子游標(biāo)與共享游標(biāo)
???
啟用用戶進(jìn)程跟蹤
???
PL/SQL --> 動態(tài)SQL
???
PL/SQL --> 動態(tài)SQL的常見錯(cuò)誤
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
