Oracle綁定變量在C#.NET中的應(yīng)用及意義
一、 什么是綁定變量
綁定變量(bind variable) :
select * from emp where empno=:empno;
是用戶放入查詢中的占位符,它會(huì)告訴Oracle“我會(huì)隨后為這個(gè)變量提供一個(gè)值,現(xiàn)在需要生成一個(gè)方案,但我實(shí)際執(zhí)行語(yǔ)句的時(shí)候,會(huì)提供應(yīng)該使用的實(shí)際值”。
實(shí)質(zhì)就是用于替代sql語(yǔ)句中常量的替代變量。綁定變量能夠使得每次提交的sql語(yǔ)句都完全一樣。
二、 為什么使用綁定變量
使用綁定變量可以減少硬語(yǔ)法分析,優(yōu)化共享池的使用。在oracle 中,對(duì)于一個(gè)提交的sql語(yǔ)句,存在兩種可選的解析過(guò)程, 一種叫做硬解析,一種叫做軟解析。
當(dāng)一個(gè)sql語(yǔ)句提交后,oracle會(huì)首先檢查一下共享緩沖池里有沒有與之完全相同的語(yǔ)句,如果有的話只須執(zhí)行軟分析即可,否則就得進(jìn)行硬分析。
一個(gè)硬解析需要經(jīng)分析、解析、安全檢查 、制定執(zhí)行路徑、優(yōu)化訪問(wèn)計(jì)劃等等許多的步驟。需消耗大量的cpu及資源。
舉個(gè)例子,要查詢編號(hào)為001的兒童,下面兩種寫法都可以實(shí)現(xiàn):
select * from t_child where childid=’001’;//不使用綁定變量
select * from t_child where childid =: childid;//使用綁定變量
但是實(shí)際應(yīng)用中經(jīng)常是查詢編號(hào)為001的兒童一次以后,有可能再也不用;接著你有可能查詢兒童’002’,然后查詢’003’等等。這樣每次查詢都是新的查詢,都需要硬解析;
而第二個(gè)查詢語(yǔ)句提供了綁定變量: childid,它的值在查詢執(zhí)行時(shí)提供,查詢經(jīng)過(guò)一次編譯后,查詢方案存儲(chǔ)在共享池中,可以用來(lái)檢索和重用;在性能和伸縮性方面,這兩者的差異是巨大的,甚至是驚人的;
若不使用綁定變量,每個(gè)查詢的條件不同導(dǎo)致共享池中SQL語(yǔ)句數(shù)量太多,重用性極低,加速了SQL語(yǔ)句的老化,導(dǎo)致共享池碎片過(guò)多。 共享池中不同的SQL語(yǔ)句數(shù)量巨大,根據(jù)LRU原則,一些語(yǔ)句逐漸老化,最終被清理出共享池;這樣就導(dǎo)致shared_pool_size 里面命中率下降,共享池碎片增多,可用內(nèi)存空間不足。而為了維護(hù)共享池內(nèi)部結(jié)構(gòu),需要使用latch,一種內(nèi)部生命周期很短的lock,這將使用大量的cpu 資源,使得性能急劇下降。
不使用綁定變量違背了oracle 的shared pool 的設(shè)計(jì)的原則,違背了這個(gè)設(shè)計(jì)用來(lái)共享的思想。
|
|