绑定变量要求变量名称,数据类型以及长度是一致,否则无法使用软解析

绑定变量(bind variable)是指在DML语句中使用一个占位符,即使用冒号后面紧跟变量名的形式,如下

select * from emp where empno=7788 --未使用绑定变量

select * from emp where empono=:eno --:eno即为绑定变量

在第二个查询中,变量值在查询执行时被提供。该查询只编译一次,随后会把查询计划存储在一个共享池(库缓存)中,以便以后获取

和重用这个查询计划。

下面使用了绑定变量,但两个变量其实质是不相同的,对这种情形,同样使用硬解析

select * from emp where empno=:eno;

select * from emp where empno=:emp_no

使用绑定变量时要求不同的会话中使用了相同的回话环境,以及优化器的规则等。

使用绑定变量的例子(参照了TOM大师的Oracle 9i&10g编程艺术)

scott@ASMDB> create table tb_test(col int); --创建表tb_test

scott@ASMDB> create or replace procedure proc1 --创建存储过程proc1使用绑定变量来插入新记录

2 as

3 begin

4 for i in 1..10000

5 loop

6 execute immediate 'insert into tb_test values(:n)' using i;

7 end loop;

8 end;

9 /

Procedure created.

scott@ASMDB> create or replace procedure proc2 --创建存储过程proc2,未使用绑定变量,因此每一个SQL插入语句都会硬解析

2 as

3 begin

4 for i in 1..10000

5 loop

6 execute immediate 'insert into tb_test values('||i||')';

7 end loop;

8 end;

9 /

Procedure created.

scott@ASMDB> exec runstats_pkg.rs_start

PL/SQL procedure successfully completed.

scott@ASMDB> exec proc1;

PL/SQL procedure successfully completed.

scott@ASMDB> exec runstats_pkg.rs_middle;

PL/SQL procedure successfully completed.

scott@ASMDB> exec proc2;

PL/SQL procedure successfully completed.

scott@ASMDB> exec runstats_pkg.rs_stop(1000);

Run1 ran in 1769 hsecs

Run2 ran in 12243 hsecs --run2运行的时间是run1的/1769≈倍

run 1 ran in 14.45% of the time

Name Run1 Run2 Diff

LATCH.SQL memory manager worka 410 2,694 2,284

LATCH.session allocation 532 8,912 8,380

LATCH.simulator lru latch 33 9,371 9,338

LATCH.simulator hash latch 51 9,398 9,347

STAT...enqueue requests 31 10,030 9,999

STAT...enqueue releases 29 10,030 10,001

STAT...parse count (hard) 4 10,011 10,007 --硬解析的次数,前者只有四次

STAT...calls to get snapshot s 55 10,087 10,032

STAT...parse count (total) 33 10,067 10,034

STAT...consistent gets 247 10,353 10,106

STAT...consistent gets from ca 247 10,353 10,106

STAT...recursive calls 10,474 20,885 10,411

STAT...db block gets from cach 10,408 30,371 19,963

STAT...db block gets 10,408 30,371 19,963

LATCH.enqueues 322 21,820 21,498 --闩的队列数比较

LATCH.enqueue hash chains 351 21,904 21,553

STAT...session logical reads 10,655 40,724 30,069

LATCH.library cache pin 40,348 72,410 32,062 --库缓存pin

LATCH.kks stats 8 40,061 40,053

LATCH.library cache lock 318 61,294 60,976

LATCH.cache buffers chains 51,851 118,340 66,489

LATCH.row cache objects 351 123,512 123,161

LATCH.library cache 40,710 234,653 193,943

LATCH.shared pool 20,357 243,376 223,019

Run1 latches total versus runs -- difference and pct

Run1 Run2 Diff Pct

157,159 974,086 816,927 16.13% --proc2使用闩的数量也远远多于proc1,其比值是.13%

PL/SQL procedure successfully completed.

由上面的示例可知,在未使用绑定变量的情形下,不论是解析次数,闩使用的数量,队列,分配的内存,库缓存,行缓存远远高于绑定

变量的情况。因此尽可能的使用绑定变量避免硬解析产生所需的额外的系统资源。

绑定变量的优点

减少SQL语句的硬解析,从而减少因硬解析产生的额外开销(CPU,Shared pool,latch)。其次提高编程效率,减少数据库的访问次数。

绑定变量的缺点

优化器就会忽略直方图的信息,在生成执行计划的时候可能不够优化。SQL优化相对比较困难

sql like 绑定变量_码硬解析的改进方法之二使用绑定变量相关推荐

  1. @value 静态变量_面试官:为什么静态方法不能调用非静态方法和变量?

    这个可能很多人之前学习jvm的时候都会遇到,属于一个小问题,写这篇文章的原因是我在看java相关的面试题目中遇到的,因此顺手总结一下: 一.例子 我们先看效果: 我们在静态方法main中调用非静态变量 ...

  2. anaconda的python环境变量_装了anaconda之后如何设置anaconda、python环境变量

    装了anaconda之后如何设置anaconda.python环境变量 1.装了anaconda之后如何设置anaconda环境变量 参考 https://www.cnblogs.com/avivi/ ...

  3. sql增删改查_增删改查!sql2pandas方法手册

    数据分析 Author:louwill Machine Learning Lab 作为一名数据分析师,利用SQL熟练的取数是一项必备的基础能力.除了SQL以外,Python的pandas也为我们提供了 ...

  4. 中修改环境变量_系统小技巧:彻底弄懂Windows 10环境变量

    每当我们进行系统清理时,清理软件总能自动找到Windows的临时文件夹之所在,然后加以清理,即便是我们重定向了TEMP目录也是如此.究其原因,是因为清理软件会根据TEMP环境变量来判断现有临时文件夹的 ...

  5. cmake cache变量_反复研究好几遍,我才发现关于 CMake 变量还可以这样理解!

    本文的排版有些问题,如果您觉得本文排版不太好看,可以到这里查看: 反复研究好几遍,我才发现关于 CMake 变量还可以这样理解!​mp.weixin.qq.com 摘要: 本文记录一下 CMake 变 ...

  6. java中virtual关键字_浅谈virtual、abstract方法和静态方法、静态变量理解

    说点对这几个容易混淆的词的理解: 1.c++中的virtual方法的 virtual关键字主要是防止继承中重复继承父类的同一个方法而设置的标识. 2.virtual与abstract关键字的不同之处在 ...

  7. python跨行字符串 变量_在Python中有没有在多行字符串中使用变量的方法?

    所以我把这个作为邮件发送脚本的一部分:try: content = ("""From: Fromname To: Toname MIME-Version: 1.0 Con ...

  8. java 存储变量_如何在Java 8中将方法存储在变量中?

    小编典典 是的,您可以对任何方法进行变量引用.对于简单的方法,通常使用java.util.function.*class就足够了.这是一个工作示例: import java.util.function ...

  9. ue4显示变量_【程序猿】虚幻引擎4: 将C++变量暴露给蓝图

    原标题:[程序猿]虚幻引擎4: 将C++变量暴露给蓝图 翻译:王成林(麦克斯韦的麦斯威尔) 审校:黄秀美(厚德载物) 在这篇教程中我将为你们展示将代码中的变量暴露给UE4编辑器所需要的工作流程.虽然这 ...

最新文章

  1. VS2013\VS2017 使用git 总是需要输入账号密码
  2. SAP MIGO 发货批次确定界面批次可用数量无穷大问题之对策
  3. Spring - Java/J2EE Application Framework 应用框架 第 3 章 Beans, BeanFactory和ApplicationContext
  4. 大数据时代,如何让个人信息不再“裸奔”?
  5. 使用公式给参数赋默认初始值
  6. follow up transaction type determination
  7. 跟踪React流–将Spring Cloud Sleuth与Boot 2结合使用
  8. C语言 va_arg 宏 - C语言零基础入门教程
  9. 《现代操作系统》精读与思考笔记 第一章 引论
  10. java future用法_你必须掌握的 21 个 Java 核心技术
  11. javascript 常用的数组操作
  12. linux 64 mysql下载官网_Linux下安装MySQL5.7
  13. IDM下载工具(免费下载视频、音乐、图片等文件)
  14. Flutter开发之常用Widget学习
  15. 【C语言学习】sscanf的简单使用.
  16. 编程编辑器推荐(编程常用编辑器的横向对比)
  17. 【WSAGetLastError】WSAGetLastError返回值
  18. android 代码审核 同质化,李相国:Android同质化竞争以差异制胜
  19. 国产FPGA厂商及产品
  20. avdd-supply and vdd_io-supply两个属性解析调用regulator_get(dev, “vdd_io“)

热门文章

  1. 7-4 jmu-Java-06异常-04-自定义异常(综合) (15 分)
  2. apache camel 相关配置_MyBatis-Plus返回map自动转驼峰配置object-wrapper-factory
  3. ant design vue table 高度自适应_2年Vue项目实战经验汇总!
  4. Java黑皮书课后题第2章:2.18(打印表格)编写程序,显示下面的表格,将浮点数值类型转化为整数
  5. linux oracle目录权限不够,Linux 目录权限不足导致ORA-39070错误 | 信春哥,系统稳,闭眼上线不回滚!...
  6. 程序员面试100题之二:跳台阶问题(变态跳台阶)
  7. Cookie防伪造防修改
  8. DATETIME与TIMESTAMP
  9. SparkProgrammingRDDs
  10. ionic overflow:auto失效