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按照标准流程来解析和执行。

posted on 2014-01-10 14:28  elen-  阅读(3595)  评论(0编辑  收藏  举报

导航