如何解析sql语句中的绑定变量
发布网友
发布时间:2022-04-21 06:34
我来回答
共1个回答
热心网友
时间:2022-04-09 13:55
1. 认识绑定变量:
绑定变量是为了减少解析的,比如你有个语句这样
select aaa,bbb from ccc where ddd=eee;
如果经常通过改变eee这个谓词赋值来查询,像如下
select aaa,bbb from ccc where ddd=fff;
select aaa,bbb from ccc where ddd=ggg;
select aaa,bbb from ccc where ddd=hhh;
每条语句都要被数据库解析一次,这样比较浪费资源,如果把eee换成“:1”这样的绑定变量形式,无论ddd后面是什么值,都不需要重复解析
Java实现绑定变量的方法:
[java] view plaincopy
PreparedStatement pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");
pstmt.setBigDecimal(1, 15.00);
pstmt.setInt(2, 110592);
/result statmement: UPDATE employees SET salay = 15.00 WHERE id = 110592
pstmt.executeQuery();
假设要将id从1到10000的员工的工资都更新为150.00元,不使用绑定变量,则:
[java] view plaincopy
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 1");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 2");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 3");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 4");
....
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 10000");
使用绑定变量,则:
[java] view plaincopy
PreparedStatement pstmt;
for (id = 1; id < 10000; id )
{
if (null == pstmt)
pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");
pstmt.setBigDecimal(1, 150.00);
pstmt.setInt(2, id);
pstmt.executeQuery();
}
二者区别在于,不用绑定变量,则相当于反复解析、执行了1w个sql语句。使用绑定变量,解析sql语句只用了一次,之后的9999次复用第一次生成的执行计划。显然,后者效率会更高一些。
2. 什么时候不应该/不必要使用绑定变量
a. 如果你用数据仓库,一条大查询一跑几个小时,根本没必要做绑定变量,因为解析的消耗微乎其微。
b. 变量对优化器产生执行计划有很重要的影响的时候:绑定变量被使用时,查询优化器会忽略其具体值,因此其预估的准确性远不如使用字面量值真实,尤其是在表存在数据倾斜(表上的数据非均匀分布)的列上会提供错误的执行计划。从而使得非高效的执行计划被使用。
3. 绑定变量在OceanBase中的实现
目前OceanBase中实现了绑定变量,目的主要是为了编程方便,而不是为了降低生成执行计划的代价。为什么呢?因为OceanBase中目前使用的是一种”静态执行计划“,无论什么Query,执行流程都一样。OB在前端代理ObConnector中实现绑定变量,将用户传入的变量进行to_string()操作,替代SQL语句中相应的部分,形成一个完整的SQL。然后这个SQL传递给MS,MS按照标准流程来解析和执行。相信不远的将来,OB将会实现真正意义上的绑定变量,让用户享受到绑定变量带来的好处。
绑定变量SQL语句实现
在SQL编程中,变量的使用是常见的操作。首先,你需要通过var关键字来声明一个变量,明确指定变量的名称和数据类型。例如:SQL> var i varchar2(10);这里,我们声明了一个名为i的变量,其类型为可变长度的字符字符串,最多容纳10个字符。然后,你可以使用exec语句来给这个变量赋值。赋值操作使用=:符号...
如何查看Oracle SQL绑定变量
sql_id,name, datatype_string, last_captured,value_string from v$sql_bind_capture where sql_id='dxfcacn4t4ppw' order by LAST_CAPTURED,POSITION;--这个sql从awr中读取绑定变量值信息 select instance_number, sql_id,name, datatype_string,last_captured,value_string from dba_hist_sqlbind...
什么是SQL绑定变量,如何实现绑定变量
set @var = '变量';set @sql = 'select * from post where post_addr like ''%'+@var+'%''';--注意,sql默认是不支持双引号的,只能用单引号 exec @sql;
oracle sql语法 ①中的:1代表什么;②中声明的变量类型是什么;③中的...
1. 这是一个绑定变量的标准写法,:1可以理解为一个占位符。OLTP系统里面使用这种绑定变量的写法可以减少硬解析的次数,减少对数据字典以及Latch的使用,单个语句上提升的不大,但是对于整体性能有很大的提升。2. 声明了一个number数组类型num_list,其最大存储number元素的个数为20。java里面类似于int[20...
SQL语句执行流程与顺序原理解析
如果SQL语句中使用了绑定变量,扫描绑定变量的声明,给绑定变量赋值,将变量值带入执行计划。若在解析的第一个步骤,SQL在高速缓冲中存在,则直接跳到该步骤。第四步:语句执行语句解析只是对SQL语句的语法进行解析,以确保服务器能够知道这条语句到底表达的是什么意思。等到语句解析完成之后,数据库服务器进程才会真正的执行...
谁能讲讲sql硬软解析的区别
DML:INSERT,UPDATE,DELETE,SELECT DDL:CREATE,DROP,ALTER 一. SQL 解析过程 Oracle对此SQL将进行几个步骤的处理过程:1、语法检查(syntax check): 检查此sql的拼写是否语法。2、语义检查(semantic check): 诸如检查sql语句中的访问对象是否存在及该用户是否具备相应的权限。3、对sql语句进行解析(prase)...
系统的一个异常SQL的处理
下面是查询到的绑定变量值,可以通过查看v$sql_bind_capture视图来查看变量的实际值,如果时间比较久,可以使用如下的语句查看历史的绑定变量信息 以下是开启了autotrace 选项跟踪的手工执行情况,从执行效率上看是没有问题的。从执行计划和表的数据量等方面判断如果sql的开销有问题,应该出现在表SAMS_CHECK...
如何在对in操作使用变量绑定
一种是使用一个固定的极限值,例如:99999,另一种是使用绑定变量。试验结果见文末,这两种方式产生的执行计划采用了Hash连接,执行计划比不使用RowNum实体化视图更差。第2种方式,如果使用指定嵌套连接提示或指定索引提示则需要对每个SQL针对性处理,需要分析具体的SQL。所以,一般情况建议在SQL中使用/*+ ...
2020-01-20 oracle中sql如何执行,什么是硬解析和软解析
这个过程需要一定的时间和资源,但执行的生成可以提高SQL语句的执行效率。软解析是指当Oracle在执行SQL语句时,发现该语句已经被解析过并且执行已经存在,那么就不需要再次解析,直接使用已有的执行进行执行。这样可以提高SQL语句的执行效率,省去解析的时间和资源。在实际应用中,SQL语句的执行过程中可能会出现...
如何找出错误ora-07445发生时系统执行的语句
在trace file中查找错误出现时的语句主要分两个步骤:首先找到错误发生时的执行语句,然后需要找到语句中绑定变量的值。Step 1:Find the SQL 在跟踪文件中查找字符串“Current cursor”(一般在cursor dump段的起始部分),使用current cursor后面的数字定位出错时系统的执行语句。如果找到的这个数字为0说明...