不使用绑定变量而使用硬编码是oracle性能问题的主要原因和可伸缩性的主要障碍
而且这种障碍是除了使用绑定变量以外很难改变的!
下面根据一个简单的试验来查看硬编码与使用绑定变量对性能的影响:
在一个查询中我们可以使用两种方式:
比如查询个人编号:
select * from ac01 where aac001=123;
另外,也可以查询:
select * from ac01 where aac001=:grbh;
在典型的系统中,查询员工123 一次,可能以后也不会查询,以后将查询员工456,然后查询员工789,等
对于这个查询方式,我们看到,对于每一次的查询来说都是新的查询,即数据库中没有过的查询。每次的查询都要经过分析、限定(名称解析)、安全检查、优化等等,简单的说,执行的每条语句在每次执行时都将必须经过编译。这样的结果会造成share pool,即SGA中的共享池迅速的填满,而oracle不得不花费大量的时间来整理,这也违背了share pool的设计思想。
然而,第二个查询使用了绑定变量:grbh。查询经过一个编译后,查询方案存储在共享池中,只保留这一个副本,可以用来检索和重用。
在性能和可伸缩性方面,这两者的差异是巨大的,甚至是惊人的。
看看这个例子:
SQL> alter system flush shared_pool
2 ;
System altered.
SQL> set timing on
SQL> declare
2 type rc is ref cursor;
3 l_rc rc;
4 l_dummy all_objects.object_name%type;
5 l_start number default dbms_utility.get_time;
6 begin
7 for i in 1..1000
8 loop
9 open l_rc for
10 'select object_name from all_objects where object_id ='||i;
11 fetch l_rc into l_dummy;
12 close l_rc;
13 end loop;
14 dbms_output.put_line(round((dbms_utility.get_time-l_start)/100,2)||
15 'seconds ..');
16 end;
17 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:11.09
注意,没有使用绑定变量方式,花费了11秒
SQL> declare
2 type rc is ref cursor;
3 l_rc rc;
4 l_dummy all_objects.object_name%type;
5 l_start number default dbms_utility.get_time;
6 begin
7 for i in 1..1000
8 loop
9 open l_rc for
10 'select object_name from all_objects where object_id=:x'
11 using i;
12 fetch l_rc into l_dummy;
13 close l_rc;
14 end loop;
15 dums_output.put_line
16 (round((dbms_utility.get_time-l_start)/100,2)||
17 'seconds..');
18 end;
19 /
dums_output.put_line
*
ERROR at line 15:
ORA-06550: line 15, column 2:
PLS-00201: identifier 'DUMS_OUTPUT.PUT_LINE' must be declared
ORA-06550: line 15, column 2:
PL/SQL: Statement ignored
Elapsed: 00:00:00.08
SQL> edit
Wrote file afiedt.buf
1 declare
2 type rc is ref cursor;
3 l_rc rc;
4 l_dummy all_objects.object_name%type;
5 l_start number default dbms_utility.get_time;
6 begin
7 for i in 1..1000
8 loop
9 open l_rc for
10 'select object_name from all_objects where object_id=:x'
11 using i;
12 fetch l_rc into l_dummy;
13 close l_rc;
14 end loop;
15 dbms_output.put_line
16 (round((dbms_utility.get_time-l_start)/100,2)||
17 'seconds..');
18* end;
SQL> /
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.18
而使用绑定变量的方式,只用了不到一秒的时间!
从而可以看出,对于绑定变量的使用,可以提高系统性能的极大提高![size=xx-large][/size]
分享到:
相关推荐
### Java中Oracle操作绑定变量使用用户工具模块解决方案 #### 一、背景介绍 在Java开发过程中,特别是与Oracle数据库交互的应用场景中,SQL语句的编写及执行效率一直是开发者关注的重点之一。为了提高SQL语句的...
绑定变量的使用限制条件是,绑定变量只能在查询语句中使用,并且只能在执行查询时提供具体的值。例如,在上面的查询语句中,我们可以使用 `:empno` 绑定变量来代替具体的值 `123`。 绑定变量的应用实例 下面是一个...
为了解决这些问题,我们可以使用预编译的PreparedStatement对象来绑定变量,例如: ```java String sql = "select name from oms_user where id=?"; PreparedStatement pstmt = connection.prepareStatement(sql); ...
- **PL/SQL块**:在Oracle的存储过程、函数和触发器中,也可以使用绑定变量来提高代码的复用性和性能。 - **数据导入导出工具**:如SQL*Loader和Data Pump等工具,允许使用绑定变量进行大规模数据的批量操作。 3....
相反,如果使用绑定变量,Oracle会尝试在共享池(Shared Pool)中查找相同的基本SQL结构,如果找到,就进行软分析(Soft Parse),从而避免重复的工作。 不使用绑定变量的另一个负面影响是共享池中的SQL语句数量...
- **绑定变量的局限**:并非所有情况都适合使用绑定变量,例如,当查询的执行计划依赖于变量值时(如在WHERE子句中使用函数或复杂的表达式),可能需要调整策略。 - **绑定变量与绑定变量提示**:在某些情况下,...
本文将深入探讨绑定变量的原理、优势以及如何在实际应用中使用。 首先,为什么我们要使用绑定变量?这主要是为了提高应用程序的可伸缩性和性能。Oracle的共享池是一个内存结构,用于存储编译后的SQL语句和PL/SQL块...
【Oracle的绑定变量】在数据库管理系统中,尤其是Oracle OLTP(在线事务处理)系统中,绑定变量是一个关键的性能优化技术。它对于提高系统效率、减少资源消耗具有显著作用。绑定变量的基本思想是通过变量来替代SQL...
该功能通过在绑定变量中存储执行计划,从而避免了每次执行 SQL 语句时都需要重新生成执行计划的过程。 绑定变量窥视功能的工作原理是,在解析 SQL 语句时,将输入的绑定变量的值带入 SQL 语句中,从而猜测该 SQL ...
相反,绑定变量允许我们在查询中使用占位符,这些占位符的值在实际执行时才会提供。这样,查询计划只需要编译一次,随后多次执行时可以复用,从而提高执行速度并减少资源消耗。 例如,对比以下两个查询: 1. 硬...
查找未使用绑定变量sql.sql
在PHP中利用绑定变量提高Oracle的存储效率是一个重要的优化策略,尤其对于处理大量数据库操作的Web应用程序来说。Oracle数据库以其高效、稳定和丰富的优化机制著称,而PHP作为流行的服务器端脚本语言,广泛用于...
### 如何绑定变量 在OLTP(Online Transaction Processing...通过以上方法,我们可以有效地在Oracle数据库中使用绑定变量来优化SQL语句的执行效率,特别是在OLTP系统中,这种方法对于提升系统的整体性能具有重要意义。
绑定变量允许在SQL语句中使用程序变量作为参数,这不仅提高了代码的可读性和维护性,还增强了SQL语句的灵活性和效率。 ### SQL绑定变量的重要性 在数据库操作中,频繁地执行相同或相似的SQL语句会消耗大量的系统...
Oracle变量绑定是数据库优化的重要策略,尤其是在Java编程中与Oracle数据库交互时。...因此,在开发Java应用程序并与Oracle数据库交互时,应尽可能使用绑定变量,以优化数据库操作,提升系统效率。
总的来说,Oracle的绑定变量特性是提高数据库性能和可扩展性的关键,尤其是在处理大量并发请求和大数据量时,正确使用绑定变量可以显著减少系统资源消耗,提高响应速度,保证系统稳定运行。在设计和开发Oracle数据库...
需要注意的是,绑定变量可以在PL/SQL过程中使用,例如: Declare i number; Begin i := 1; Select * from tt where id = :i; End; 在上面的示例中,我们在PL/SQL过程中定义了一个绑定变量i,然后将其赋值为1,...
- 文本或标签中使用 `@{biServer.variables['变量名']}` 调用。 ##### 3.2 动态库变量 (Dynamic Repository Variables) **定义**: 动态库变量是其值可能随时间变化的变量。这些变量通常需要定义初始化块来设置初始...
动态SQL与绑定变量是数据库编程中的重要概念,尤其在Oracle数据库中被广泛应用。动态SQL允许在运行时构建和执行SQL语句,而绑定变量则是在动态SQL中用于替代具体值的占位符,使得SQL语句更为灵活和高效。 ### 1. ...