1,綁定變量減少了解析
假設要將id從1到10000的員工的工資都更新為150.00元,
不使用綁定變量
sql.executeQuery("update employees set salay150 where id=1");
sql.executeQuery("update employees set salay150 where id=2");
................
sql.executeQuery("update employees set salay150 where id=10000");
使用綁定變量則
PreparedStatement pstmt;
for(id=1;id<10000;id++){
if(null=pstmt)
pstmt=con.prepareStatement("update employees set salay=? where id=?");
pstmt.setBigDecimal(1,150);
pstmt.setInt(2,id);
pstmt.executeQuery();
}
二者區別在於,不用綁定變量,則相當於反復解析、執行一萬個sql語句。使用綁定變量,解析sql語句只用了一次,之后的9999次服用第一次生成的執行計划。顯然,后者的效率更高一些
2,什么時候不應該/不必要使用綁定變量
a,如果你用數據倉庫,一條大查詢一跑幾個小時,根本沒必要做綁定變量,因為解析消耗微乎其微。
b變量對優化器產生執行計划有很重要的影響的時候:比昂丁變量被使用時,查詢優化器會忽略其具體值,因此其預估的准確性遠不如使用字面量的值真是,尤其是在表存在數據傾斜的列上會提供錯誤的執行計划。從而使得非高效的執行計划被使用。
綁定變量在OceanBase中的實現
OceanBase是一個支持海量數據的高性能分布式數據庫系統
目前OceanBase中實現了綁定變量,主要目的是為了編程方便,而不是為了降低生成執行計划的代價。
OceanBase目前使用的是一種"靜態執行計划",無論什么Query,執行流程都一樣OB在前端代理ObConnector中實現綁定變量,將用戶傳入的變量進行to_string()操作,代替sql語句中相應的部分,形成一個完整的SQL。然后這個SQL傳遞給MS,MS按照標准流程來解析和執行。