資源描述:
《動(dòng)態(tài)sql及綁定變量》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、動(dòng)態(tài)SQL及綁定變量?一.綁定變量:?綁定變量是解決硬解析的首要利器,能解決OLTP系統(tǒng)中l(wèi)ibrarycache的過(guò)度耗用以提高性能。減少解析。?在SQL語(yǔ)句中,綁定變量是一個(gè)占位符。例如,為了查詢員工號(hào)為123的員工的信息,可以查詢:1)??1select*fromempwhereempno=123;??另外,也可以查詢:2)?1select*fromempwhereempno=:empno。?????那么每次查詢都是一個(gè)新查詢,即在數(shù)據(jù)庫(kù)共享池中以前沒(méi)有過(guò)的查詢。每次查詢必須經(jīng)過(guò)分析、限定(名稱解析)、安全檢查、優(yōu)化等等,簡(jiǎn)單地說(shuō),執(zhí)行的每條語(yǔ)句在每次執(zhí)行時(shí)都將必須經(jīng)過(guò)編
2、譯。?在第二個(gè)查詢2)中使用了綁定變量:empno,它的值在查詢執(zhí)行時(shí)提供。查詢經(jīng)過(guò)一次編譯后,查詢方案將存儲(chǔ)在共享池中,可以用來(lái)檢索和重用。在性能和可伸縮性方面,這兩者的差異是巨大的,甚至是驚人的??????從上所述,很明顯看出,分析一個(gè)帶有硬編碼量的語(yǔ)句將比重用一條已分析過(guò)的查詢方案花費(fèi)更長(zhǎng)的時(shí)間和消耗更多的資源,不明顯的是前者將減少系統(tǒng)所能支持的用戶數(shù)量。很明顯,部分原因是由于增加資源消耗量,但更主要的因素是在解析sql語(yǔ)句的過(guò)程中對(duì)共享池中鎖存器(latch)的爭(zhēng)搶?????通過(guò)使用綁定變量,應(yīng)用程序提交的相似的sql語(yǔ)句只需要解析一次,就可以重復(fù)使用,這非常有效,這也
3、是Oracle?數(shù)據(jù)庫(kù)要求使用的工作方式。不僅使用較少的資源,而且可以減少鎖存(latch)時(shí)間,降低鎖存(latch)次數(shù),這將提高應(yīng)用系統(tǒng)性能,并且大大提高可伸縮性。?了解綁定變量,就不得不了解硬解析與軟解析。硬解析簡(jiǎn)言之即一條SQL語(yǔ)句沒(méi)有被運(yùn)行過(guò),處于首次運(yùn)行,則需要對(duì)其進(jìn)行語(yǔ)法分析,語(yǔ)義識(shí)別,跟據(jù)統(tǒng)計(jì)信息生成最佳的執(zhí)行計(jì)劃,然后對(duì)其執(zhí)行。而軟解析呢,則是由于在librarycache已經(jīng)存在與該SQL語(yǔ)句一致的SQL語(yǔ)句文本、運(yùn)行環(huán)境,即有相同的父游標(biāo)與子游標(biāo),采用拿來(lái)主義,直接執(zhí)行即可。軟解析同樣經(jīng)歷語(yǔ)法分析,語(yǔ)義識(shí)別,且生成hashvalue,接下來(lái)在librar
4、ycache搜索相同的hashvalue,如存在在實(shí)施軟解析。????綁定變量???首先其實(shí)質(zhì)是變量,有些類似于我們經(jīng)常使用的替代變量,替代變量使用&占位符,只不過(guò)綁定變量使用:???替代變量使用時(shí)為&variable_para,相應(yīng)的綁定變量則為:bind_variable_para???通常一個(gè)SQL語(yǔ)句包含動(dòng)態(tài)部分和靜態(tài)部分,占位符實(shí)質(zhì)是SQL語(yǔ)句中容易發(fā)生變化的部分,通常為其條件或取值范圍。動(dòng)態(tài)部分在一般情???況下(數(shù)據(jù)傾斜除外),對(duì)執(zhí)行計(jì)劃的生成的影響是微乎其微的。故同一SQL語(yǔ)句不同的動(dòng)態(tài)部分產(chǎn)生的執(zhí)行計(jì)劃都是相同的。綁定變量的優(yōu)缺點(diǎn)及使用場(chǎng)合??優(yōu)點(diǎn):????可
5、以在librarycache中共享游標(biāo),避免硬解析以及與之相關(guān)的額外開(kāi)銷????在大批量數(shù)據(jù)操作時(shí)將呈數(shù)量級(jí)來(lái)減少閂鎖的使用,避免閂鎖的競(jìng)爭(zhēng)?????缺點(diǎn):????綁定變量被使用時(shí),查詢優(yōu)化器會(huì)忽略其具體值,因此其預(yù)估的準(zhǔn)確性遠(yuǎn)不如使用字面量值真實(shí),尤其是在表存在數(shù)據(jù)傾斜(表上的數(shù)????據(jù)非均勻分布)的列上會(huì)提供錯(cuò)誤的執(zhí)行計(jì)劃。從而使得非高效的執(zhí)行計(jì)劃被使用。????使用場(chǎng)合:????OLTP??????在OLTP系統(tǒng)中SQL語(yǔ)句重復(fù)執(zhí)行頻度高,但處理的數(shù)據(jù)量較少,結(jié)果集也相對(duì)較小,尤其是使用表上的索引來(lái)縮小中間結(jié)果集,其??????解析時(shí)間通常會(huì)接近或高于執(zhí)行時(shí)間,因此該場(chǎng)
6、合適合使用綁定變量。????????OLAP??????在OLAP系統(tǒng)中,SQL語(yǔ)句執(zhí)行次數(shù)相對(duì)較少,但返回的數(shù)據(jù)量較大,因此多數(shù)情況下傾向于使用權(quán)標(biāo)掃描更高效,其SQL語(yǔ)句執(zhí)行時(shí)??????間遠(yuǎn)高于其解析時(shí)間,因此使用綁定變量對(duì)于總響應(yīng)時(shí)間影響不大。而且增加生成低效執(zhí)行計(jì)劃的風(fēng)險(xiǎn)。即在在OLAP系統(tǒng)中使用字??????面量的性能高于使用綁定變量。????注意:????對(duì)于實(shí)際的數(shù)據(jù)庫(kù)對(duì)象,如(表,視圖,列等),不能使用綁定變量替換,只能替換字面量。如果對(duì)象名是在運(yùn)行時(shí)生成的,則需要對(duì)其????用字符串拼接,同時(shí),sql只會(huì)匹配已經(jīng)在共享池中相同的對(duì)象名??二、動(dòng)態(tài)SQL?說(shuō)動(dòng)
7、態(tài)SQL之前先來(lái)說(shuō)下靜態(tài)SQL?靜態(tài)SQL語(yǔ)句?語(yǔ)句中主變量的個(gè)數(shù)與數(shù)據(jù)類型在預(yù)編譯時(shí)都是確定的,我們稱這類嵌入式SQL語(yǔ)句為靜態(tài)SQL語(yǔ)句。?與之相對(duì)應(yīng)的就是動(dòng)態(tài)SQL?動(dòng)態(tài)SQL方法允許在程序運(yùn)行過(guò)程中臨時(shí)“組裝”SQL語(yǔ)句。?那么他們之間的區(qū)別是什么呢??靜態(tài)sql的執(zhí)行計(jì)劃(DB2稱存取路徑)是在運(yùn)行前就確定好的?動(dòng)態(tài)sql的執(zhí)行計(jì)劃(DB2稱存取路徑)是在運(yùn)行時(shí)動(dòng)態(tài)生成的。由于是在運(yùn)行時(shí)動(dòng)態(tài)生成執(zhí)行計(jì)劃,因此生成的執(zhí)行計(jì)劃(DB2稱存取路徑)相對(duì)更優(yōu),但考慮到生成執(zhí)行計(jì)劃(DB2稱