sql查詢中使用綁定變量,防止sql注入


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按照標准流程來解析和執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM