变量绑定会使联机事务处理过程(OLTP)系统数据库中的SQL执行速度飞快,内存效率极高;不使用绑定变量可能会使OLTP数据库不堪重负,资源被SQL解析严重耗尽,系统运行缓慢。

当一个用户与数据库建立连接后,会向数据库发出操作请求,即向数据库送过去SQL语句。Oracle在接收到这些SQL后,会先对这个SQL做一个hash函数运算,得到一个Hash值,然后到共享池中寻找是否有和这个hash值匹配的SQL存在。如果找到了,Oracle将直接使用已经存在的SQL的执行计划去执行当前的SQL,然后将结果返回给用户。如果在共享池中没有找到相同Hash值的SQL,oracle会认为这是一条新的SQL,会进行解析。

Oracle 解析的步骤如下:

(1)语法解析

(2)语义解析

(3)生成执行计划,这里分软解析和硬解析。硬解析是非常耗资源的

(4)SQL的执行

了解了SQL的执行过程,在来看一些绑定变量,绑定变量的本质就是本来需要做Oracle硬解析的SQL变成软解析,以减少ORACLE花费在SQL解析上的时间和资源

例子:加入有两条SQL:

Select salary from user where name=’A’;

   Select salary from user where name=’B’;

如果没有用绑定变量,那么这2条SQL会被解析2次,因为他们的谓词部分不一样。如果我们用了绑定变量,如:

Select salary from user where name=:X;

这时,之前的2条SQL就变成了一种SQL,Oracle只需要对每一种SQL做一次硬解析,之后类似的SQL都使用这条SQL产生的执行计划,这样就可以大大降低数据库花费在SQL解析上的资源开销。这种效果当SQL执行的越多,就越明显。

简单的说,绑定变量就是拿一个变量来代替谓词常量,让Oracle每次对用户发来的SQL做hash 运算时,运算出的结果都是同样的Hash值,于是将所有的用户发来的SQL看作是同一个SQL来对象。

-------------------------------------------------------------------------------------------------------------------

为了在PL/SQL 环境中声明绑定变量,使用命令VARIABLE。例如:

1
2
VARIABLE return_code NUMBER
VARIABLE return_msg VARCHAR2(20)

可以通过SQL*Plus命令中的PRINT 显示绑定变量的值。例如:

1
2
PRINT return_code
PRINT return_msg

例:

1
2
3
4
5
6
7
VARIABLE result NUMBER;
BEGIN
  SELECT (sal*10)+nvl(comm, 0) INTO :result FROM emp 
  WHERE empno=7844;   --在pl/sql块中用冒号加变量名进行引用:x
END;
--然后再执行
PRINT result

最新文章

  1. 如何禁止内部viewPager滑动
  2. 百度eCharts体验
  3. SQLserver聚集表、堆和索引
  4. 面试题-->写一个函数,返回一个数组中所有元素被第一个元素除的结果
  5. DNS Prefetch
  6. Android 获取图片资源的4种方式
  7. HTML5 Canvas 中的颜色、样式和阴影的属性和方法
  8. 转:Excel转换XML工具<一>
  9. (大数据工程师学习路径)第四步 SQL基础课程----SQL介绍及mysql的安装
  10. html浏览器兼容性 JavaScript语法
  11. hibernate添加spring 事务管理注意问题记录
  12. PS小实验-去除水印
  13. Unity 3d游戏逆向及.NET Reflector工具使用介绍
  14. Python内置函数(68)——__import__
  15. EF提示“序列化类型为XXX的对象时检测到循环引用”
  16. [Codeforces441E]Valera and Number
  17. MySQL中的时态(日期/时间)数据类型
  18. <meta>标签中,X-UA-Compatible和IE=Edge,chrome=1的作用
  19. Spring全家桶系列–[SpringBoot入门到跑路]
  20. 表达谱(DGE)测序与转录组测序的差别

热门文章

  1. ubuntu安装软件依赖解决
  2. AndroidStudio项目提交到github最详细步骤
  3. Linux小知识(1): bash中执行数据库的相关操作
  4. POJ 3660—— Cow Contest——————【Floyd传递闭包】
  5. ios 你必须了解的系统定义宏使用
  6. 创建Podspec 并且发布到github spec
  7. WiFi调试手机
  8. Linq to Sql 左连接 , 取右表可能为 null的 int类型字段
  9. springboot 修改和设置 banner
  10. 创建Gradle工程出现Could not install Gradle distribution from 'https://services.gradle.org/distributions/gradleXX'.问题解决