程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Oracle綁定變量在C#.NET中的應用及意義

Oracle綁定變量在C#.NET中的應用及意義

編輯:C#入門知識

一、 什麼是綁定變量
綁定變量(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 的設計的原則,違背了這個設計用來共享的思想。

三、 如何使用綁定變量

= = = = SqlHelper(sql, dbName, valuelist, parmlist, 

  DataSet SqlHelper( query,  dataBaseName, ArrayList bllist, ArrayList pamlist,  = ==  (adoHelper._dbFactory.DatabaseType ===  ( i = ; i < bllist.Count; i++ paramvalue =  (bllist[i] == =  OracleParameter(pamlist[i].ToString(), = (bllist[i].GetType().ToString() == = == =  ==  + 

 

四、 綁定變量使用限制條件
在對建有索引的字段(包括字段集),且字段(集)的集的勢非常大時,使用綁定變量可能會導致無法選擇最優的查詢計劃,因而會使查詢效率非常低。
集的勢非常大【即傾斜性很嚴重 】,如:一個索引字段,總記錄數有1000條,有A值的有900條;B值50條;C值50條,那麼我們就說這個字段的集的勢很大。當然這個集的勢的算法比較復雜,他跟查詢條件、是否建索引等都有關系。比如:若全表掃描:集的勢=記錄數;索引掃描,查詢條件“=”:集的勢=記錄數/字段上的唯一值數 ;
那麼為什麼說集的勢大時使用綁定變量反而會時查詢效率變低呢?
因為Oracle在執行SQL語句時,會計算各個訪問路徑的代價,采用最小代價的訪問路徑作為語句的執行計劃。若第一次查詢的條件剛好是索引字段中記錄最多的值,那麼這個索引掃描成本就非常高,根據分析會使用全表掃描,並將這個查詢計劃保存到共享池中,而當查詢其他值時成本很低,但由於采用綁定變量,不再進行硬解析,也就是不去分析采用什麼執行計劃,而是直接使用之前的這個查詢計劃,這樣會導致無法選擇最優的查詢計劃。
對於隔相當一段時間才執行一次的sql語句,利用綁定變量的好處會被不能有效利用優化器而抵消。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved