在ORACLE中,使用绑定变量,可以降低硬解析,通常可以提高系统的性能(注意,是通常,不是任何情况下)。
以表tabletest为例,我们来看看如何使用绑定变量,tabletest的表结构为
field1 number(10)
field2 number(10)
field3 number(10)
field4 number(10)
field5 number(10)
绑定变量可以理解为一个占位符 ,例如:
declare
i number;
j number;
sqlstr varchar2(200);
begin
i:=1;
j:=2;
sqlstr:='insert into 测试表 (field1,field2,field3,field4,field5) values(:x,:x,:y,:x,:x)';
execute immediate sqlstr using i,i,j,i,i;
end;
这样的一段代码中,使用i,i,j,i,i来对应:x,:x,:y,:x,:x。这段代码是正确的,但如果以为sqlstr中只有:x,:y这两个绑定变量,而把语句execute immediate sqlstr using i,i,j,i,i;改为execute immediate sqlstr using i,j;就会在运行中出现绑定变量数量不够的错误。
上面的正确代码执行完后,插入的记录从field1到field5的数据应该是1,1,2,1,1。
如果我们把execute immediate sqlstr using i,i,j,i,i;改成execute immediate sqlstr using i,j,j,i,i;执行之后,察看插入的记录,就会发现插入的记录是1,2,2,1,1
从上面可以看出,绑定变量只是起到占位的作用,同名的绑定变量并不意味着在它们是同样的,在传递时要考虑的是传递的值与绑定变量出现顺序的对位,而不是绑定变量的名称。
ORACLE系统本身是能够对变量做绑定的,例如下面的代码:
declare
i number;
begin
for i in 1..1000 loop
insert into 测试表 (i,i+1,i*1,i*2,i-1)
end loop;
end;
这段代码是不需要使用绑定变量的方法来提高效率的,ORACLE会自动将其中的变量绑定。
我们可以这样理解:这段代码执行了1000次的 insert into 测试表 (i,i+1,i*1,i*2,i-1) 语句,每次发出去的语句都是一样的。
如果把这段代码改成如下:
declare
i number;
sqlstr varchar2(200);
begin
for i in 1..1000 loop
sqlstr:='insert into 测试表 ('||to_char(i)||','||to_char(i)||'+1,'||to_char(i)||'*1,'||to_char(i)||'*2,'||to_char(i)||'-1) ';
execute immediate sqlstr;
end loop;
end;
这段代码同样是执行了1000条insert语句,但是每一条语句都是不同的,因此ORACLE会把每条语句硬解析一次,其效率就比前面那段就低得多了。如果要提高效率,不妨使用绑定变量将循环中的语句改为
sqlstr:='insert into 测试表 (:i,:i+1,:i*1,:i*2,:i-1) ';
execute immediate sqlstr using i,i,i,i,i;
这样执行的效率就高得多了。
我曾试着使用绑定变量来代替表名、过程名、字段名等,结果是语句错误,结论就是绑定变量不能当作嵌入的字符串来使用,只能当作语句中的变量来用。
从效率来看,由于oracle10G放弃了RBO,全面引入CBO,因此,在10G中使用绑定变量效率的提升比9i中更为明显。
最后,前面说到绑定变量是在通常情况下能提升效率,那哪些是不通常的情况呢?
答案是:在字段(包括字段集)建有索引,且字段(集)的集的势非常大(也就是有个值在字段中出现的比例特别的大)的情况下,使用绑定变量可能会导致查询计划错误,因而会使查询效率非常低。这种情况最好不要使用绑定变量。
相关推荐
### Java中Oracle操作绑定变量使用用户工具模块解决方案 #### 一、背景介绍 在Java开发过程中,特别是与Oracle数据库交互的应用场景中,SQL语句的编写及执行效率一直是开发者关注的重点之一。为了提高SQL语句的...
如果不使用绑定变量,每次查询都是一个新的查询,这将导致 Oracle 需要分析、解析、安全检查、优化等一系列操作。这些操作将消耗大量的系统资源,降低用户的使用数量,并且会把优化好的其它查询语句从共享池中踢出。...
为了解决这些问题,我们可以使用预编译的PreparedStatement对象来绑定变量,例如: ```java String sql = "select name from oms_user where id=?"; PreparedStatement pstmt = connection.prepareStatement(sql); ...
- **绑定变量的优化问题**:在某些情况下,Oracle的优化器可能无法准确地估计使用绑定变量的SQL语句的执行成本,可能导致执行计划不佳。这时可以通过绑定变量提示(bind peeking)或重写SQL语句来解决。 - **避免...
然而,使用绑定变量会引发一个问题,即使用绑定变量的前提是 Oracle 认为大部分的列的数据都是分布比较均匀的。如果第一次传人的绑定变量的值恰好占整个数据量的百分比较高,从而导致全表扫描的执行计划,而后来的...
- **提高性能**:使用绑定变量,Oracle只需解析和优化查询一次,然后将执行计划存储在共享池中。后续的查询可以重用这个执行计划,避免了重复的解析和优化过程,极大地提升了系统响应速度。 - **减少内存消耗**:...
Oracle数据库的绑定变量特性是其优化SQL性能的关键技术之一,对于构建高效、可扩展和稳定的数据库系统至关重要。本文将深入探讨绑定变量的原理、优势以及如何在实际应用中使用。 首先,为什么我们要使用绑定变量?...
绑定变量的作用在于,即使SQL的谓词部分(如WHERE子句)的值不同,Oracle也能通过使用相同的哈希值将它们视为同一SQL。例如,使用绑定变量":X"的SQL `SELECT salary FROM user WHERE name=:X`可以替代多个特定名字的...
相反,如果使用绑定变量,Oracle会尝试在共享池(Shared Pool)中查找相同的基本SQL结构,如果找到,就进行软分析(Soft Parse),从而避免重复的工作。 不使用绑定变量的另一个负面影响是共享池中的SQL语句数量...
Oracle数据库的绑定变量是一种优化策略,它在提升数据库性能、可扩展性和稳定性方面扮演着重要角色。绑定变量的使用能够显著改善SQL语句的执行效率,尤其是在处理大量重复查询时。本文将深入探讨绑定变量的原理、...
查找未使用绑定变量sql.sql
### 如何绑定变量 在OLTP(Online Transaction Processing...通过以上方法,我们可以有效地在Oracle数据库中使用绑定变量来优化SQL语句的执行效率,特别是在OLTP系统中,这种方法对于提升系统的整体性能具有重要意义。
标题与描述中的“SQL绑定变量”这一知识点,主要聚焦于SQL语句中如何使用变量,尤其是在存储过程或函数中动态构建SQL语句时的关键技术。绑定变量允许在SQL语句中使用程序变量作为参数,这不仅提高了代码的可读性和...
由于我们使用了绑定变量,所以Oracle只需要软分析一次,而不需要每次都进行硬分析,从而提高了数据库的性能。 需要注意的是,绑定变量可以在PL/SQL过程中使用,例如: Declare i number; Begin i := 1; Select ...
Oracle数据库的绑定变量是提升系统性能和可扩展性的重要特性,尤其对于大型企业级应用而言,正确使用绑定变量能够显著优化数据库操作。绑定变量的主要作用是减少解析和优化过程,提高查询效率,节省系统资源。 首先...
在处理大量动态查询时,使用绑定变量可以显著减少Oracle的解析次数,减轻SGA的压力,进而提升系统的整体性能。 绑定变量的工作原理是:在PHP代码中,我们不直接将变量值插入到SQL语句中,而是声明一个占位符(如`:...
### Oracle BIEE 变量总结与应用 #### 一、引言 Oracle Business Intelligence Enterprise Edition (BIEE) 是一款强大的商业智能工具,能够帮助组织机构从数据中提取价值并做出更好的决策。在 BIEE 的开发过程中,...
绑定变量的使用遵循了Oracle Shared Pool的设计理念,提高了SQL语句的复用性和系统整体性能。因此,在开发Java应用程序并与Oracle数据库交互时,应尽可能使用绑定变量,以优化数据库操作,提升系统效率。
动态SQL与绑定变量是数据库编程中的重要概念,尤其在Oracle数据库中被广泛应用。动态SQL允许在运行时构建和执行SQL语句,而绑定变量则是在动态SQL中用于替代具体值的占位符,使得SQL语句更为灵活和高效。 ### 1. ...