一、 什麼是綁定變量
綁定變量(bind variable) :
select * from emp where empno=:empno;
是用戶放入查詢中的占位符,它會告訴Oracle“我會隨後為這個變量提供一個值,現在需要生成一個方案,但我實際執行語句的時候,會提供應該使用的實際值”。
實質就是用於替代sql語句中常量的替代變量。綁定變量能夠使得每次提交的sql語句都完全一樣。
= = = = 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語句,利用綁定變量的好處會被不能有效利用優化器而抵消。