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