`

绑定变量及其优缺点

阅读更多
变量绑定(bind variable)
是指在sql语句的条件中使用变量而不是常量。比如shared pool里有两条sql语句,
select * from tab1 where col1=1;
select * from tab1 where col1=2;
对oracle数据库来说,这是两条完全不同的SQL,对这两条语句都需要进行hard parse。因为oracle会根据sql语句的文本去计算每个字符在内存里的hash值,因此虽然上述两条SQL只有一个字符不一样,oracle根据hash算法在内存中得到的hash地址就不一样,所以oracle就会认为这是两条完全不同的语句。而如果将上述SQL改写成select * from tab1 where col1=:var1;,然后通过对变量var1的赋值去查询,那么oracle对这条语句第一次会进行hard parse,以后就只进行soft parse。假设某条语句被重复执行了几十万次,那么使用bind var带来的好处是巨大的。一个应用程序如果bind var使用不充分,那么几乎一定会伴随着严重的性能问题。
绑定变量是相对文本变量来讲的,所谓文本变量是指在SQL直接书写查询条件,这样的SQL在不同条件下需要反复解析,绑定变量是指使用变量来代替直接书写条件,查询bind value在运行时传递,然后绑定执行。优点是减少硬解析,降低CPU的争用,节省shared_pool ;缺点是不能使用histogram,sql优化比较困难

对于每个程序开发人员来说,数据库的知识都是或多或少的了解些,都能编写一些SQL语句,即使不会也可以使用一些工具来生成SQL语句,因此数据库在很多时候被认为是没有必要研究的。随着系统使用人数增加,系统也遇到了瓶颈,于是开发人员高呼:“给我内存与CPU,系统将会faster!”可是作为盈利性企业,投入与回报是不能成等价比的,必须做到投入少回报多!所以,数据库的开发在系统的前期工作当中非常重要,良好的数据库设计将会提升系统的可扩展性。

数据库在执行SQL语句时会首先解析SQL语句,解析又分为硬解析与软解析。说到硬解析和软解析,就不能不说一下Oracle对sql的处理过程。当你发出一条sql语句交付Oracle,在执行和获取结果前,Oracle对此sql将进行几个步骤的处理过程:

1、语法检查(syntax check)

  检查此sql的拼写是否语法。

2、语义检查(semantic check)

   诸如检查sql语句中的访问对象是否存在及该用户是否具备相应的权限。

3、对sql语句进行解析(prase)

   利用内部算法对sql进行解析,生成解析树及执行计划。

4、执行sql,返回结果(execute and return)。

其中,软、硬解析就发生在第三个过程里,Oracle利用内部的hash算法来取得该sql的hash值,然后在librarycache里查找是否存在该hash值。假设存在,则将此sql与cache中的进行比较(注意此处的比较哪怕是一个字母的大小写、空格个数不一致都会认为不同)。假设“相同”,就将利用已有的解析树与执行计划,而省略了优化器的相关工作。这也就是软解析的过程;如果上面的2个假设中任有一个不成立,那么优化器都将进行创建解析树、生成执行计划的动作。这个过程就叫硬解析。由此可以看出应该极力避免硬解析,尽量使用软解析。

有什么方法能尽量使用软解析呢?答曰:“绑定变量,效果好”。如果使用绑定变量,只要提交引用同一对象的同一个查询,都会使用共享池中已编译的查询计划。这样你只需编译一次就能反复使用,效率当然会高。这也是数据库希望你采用的方法。

下面来看一个简单的例子,首先创建一个简单表

SQL> create table t (x int);

然后创建一个使用绑定变量往T表插入数据的存储过程:

SQL> create or replace procedure pro1

  2 as

  3  begin

  4 for i in 1..10000

  5     loop

  6      execute immediate

  7     'insert into t values(:x)' using i;

  8   end loop;

  9 end;

再创建一个不适用绑定变量往T表查数据的存储过程:

SQL> create or replace procedure pro2

  2 as

  3 begin

  4 for i in 1..10000

  5     loop

  6      execute immediate

  7     'insert into t values('||i||')';

  8   end loop;

  9 end;

下面开始执行这两个存储过程,查看下运行时间:

SQL> set timing on

SQL> exec pro1;

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.42

SQL> truncate table t; --此目的只是与执行存储过程pro1前T表都为空

表被截断。

已用时间:  00: 00: 00.20

SQL> exec pro2;

PL/SQL 过程已成功完成。

已用时间:  00: 00: 11.53

SQL> set timing off

结果非常明显,使用绑定变量节省的时间可不是一点。这只是个简单的例子,如果在实际应用中那节省的时间将会更多,可能就会造成2个不同性能级别的应用系统。在一个已成型的应用系统中再重新使用绑定变量时费时费力的,你要寻找每个SQL语句,查看是否能使用绑定变量,最重要的是你可能已经提交给客户,这直接影响到客户的满意度。

绑定变量的好处是减少了硬解析,降低了CPU的竞争,节省了shared_pool,但缺点是不能使用柱状图(histogram),SQL优化比较困难。

在系统的研发阶段,应该为数据库设计投入更多的时间,因为所有的数据都是在后台运行的,后台的性能在很大程度上决定了一个系统的性能。

不要以为数据库只有SELECT、INSERT、UPDATE、DELETE,这些只是数据库的基础操作,只是这些简单的操作就需要开发人员增加一些HINT来加快数据的操作,由这些操作还能延伸到数据库的redo日志、undo段的管理等等。数据库并不是一门简单的“语言”,数据库调优与维护更是数据库的精华所在,需要我们学而时习之!

分享到:
评论

相关推荐

    浅谈oracle 数据库的绑定变量特性及应用

    Oracle数据库的绑定变量特性及其应用是数据库管理中的一个重要概念,特别是在处理大量数据和优化SQL查询性能时。绑定变量,也称为参数化查询或占位符,是SQL语句中用特殊符号(如“:var”)代替具体值的方式,使得同...

    阿里巴巴笔试题及答案.pdf

    #### 八、绑定变量及其优缺点 - **绑定变量**: 使用变量代替硬编码的值,可以在运行时传递值。 - **优点**: - 减少SQL解析次数,提高性能。 - 增加SQL的安全性。 - **缺点**: - 对于非常规查询可能需要更多配置...

    DBA面试有答案

    绑定变量及其优缺点** - **定义**: 绑定变量是相对于文本变量而言的,即在 SQL 语句中使用变量而非直接写入条件。 - **优点**: - 减少硬解析,降低 CPU 争用。 - 节省 Shared Pool 空间。 - **缺点**: - 无法...

    Oracle面试题-NEW

    3. **绑定变量及其优缺点**:绑定变量允许SQL语句在运行时动态填充值,减少了硬解析次数,提高了性能。缺点是在某些情况下可能导致执行计划不稳定。 4. **固定执行计划**:使用hint或通过优化参数如`_optimizer_...

    2021javascript面试题.docx

    3. ajax、axios 与 fetch 的区别及优缺点:ajax 是传统的发起 HTTP 请求的方法,axios 和 fetch 都是基于 Promise 的请求库,各有其优缺点。 本文总结了 JavaScript 面试题的重要知识点,涵盖了 JavaScript 基础...

    JavaScript 45 道面试题及答案.docx

    闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。 作用域链 作用域链的作用是保证执行环境里有权访问的变量和函数是有序的。作用域链的变量只能向上...

    ES6中javascript实现函数绑定及类的事件绑定功能详解

    1. **保存`this`的引用**:使用`let that = this`或者`const self = this`等,将类的`this`保存在一个局部变量中,然后在事件回调函数中使用这个变量。这样,即使在回调函数内部,`that`或`self`仍然指向类的实例。 ...

    PB 试题及答案(PB要点,简答题,基础题,带答案)

    PB 试题及答案(PB要点,简答题,基础题,带答案) PB 是一种强大的客户机——服务器体系结构的应用系统开发工具...使用数据窗口对象的一般方法是首先创建数据窗口对象,然后设置数据源和数据绑定,最后显示数据窗口。

    面向对象编程与非面向对象编程

    本文将深入探讨这两种编程范式的概念、特点及其在实际软件工程中的应用。 ### 1. 面向对象编程 #### 1.1 概念与特性 面向对象编程是一种编程思想,它将程序中的各种实体视为对象,每个对象都包含状态(属性)和...

    OPC客户端通用型编程框架及关键性代码

    在WPF的框架下,控件设计和变量绑定主要依赖数据绑定和命令绑定功能,使得HMI的组态无需编写代码即可完成。例如,DB块控件可以在 Blend 中自定义模板,实现对不同PLC变量的可视化表示。对于Kepware服务器,虽然只能...

    30 道 Vue 面试题,内含详细讲解(涵盖入门到精通,自测 Vue 掌握程度)

    1. **SPA(单页面应用)的理解及其优缺点** - **理解**:SPA 在初次加载页面后,通过路由机制在后台更新内容,无需整体刷新页面,提供流畅的用户体验。 - **优点**: - 用户体验好,快速响应,避免页面重载和跳转...

    关于innerHTML后丢失动态绑定的EVENT问题解决方法

    在JavaScript编程中,`innerHTML`属性是一个非常常用的方法,它允许我们方便地获取或设置HTML元素内部的HTML内容。然而,当使用`innerHTML`来...每种方法都有其优缺点,应根据实际项目需求和性能考虑来选择合适的方法。

    java模式-java中的所有模式-java进阶必备···

    缺点是消耗资源,如果类的成员变量过多,将会占用比较多的内存资源。 以上是Java中常用的几种设计模式的详细介绍,掌握这些模式对于提升软件开发的质量、提高代码的复用性和维护性有着重要的作用。

    vue基础面试题及答案.pdf

    本资源摘要信息提供了 Vue 基础面试题及答案的详细知识点总结,涵盖了 Vue 的基本原理、双向数据绑定的原理、MVVM、MVC、MVP 的区别、使用 Object.defineProperty() 的缺点、Watcher 的作用等重要知识点。

    JavaScript 50道面试题及答案.docx

    1. 回调函数:优点是简单、容易理解和部署,缺点是不利于代码的阅读和维护,各个部分之间高度耦合。 2. 时间监听:可以绑定多个事件,每个事件可以指定多个回调函数,而且可以“去耦合”。 3. 发布/订阅:性质与...

Global site tag (gtag.js) - Google Analytics