<让oracle跑得更快-6> 绑定变量

标签: oracle 绑定 变量 | 发表时间:2015-02-28 21:52 | 作者:
出处:http://www.iteye.com
变量绑定是OLTP系统中一个非常值得关注的技术点。良好的变量绑定会使OLTP系统数据库中的sql执行速度飞快,内存效率极高;不绑定变量可能会使OLTP数据库不堪重负,资源被sql解析严重消耗,系统显得滞重而缓慢。

6.1 什么是变量绑定,为什么要做变量绑定
在介绍绑定变量以前,首先要介绍一下sql究竟是如何被执行的,知道了sql执行的具体细节之后,才能讨论为什么以及什么时候要做变量绑定。
当一个用户与数据库建立起了连接后,会向数据库发出操作请求,也就是向数据库发送一条(或是几条或一个pl/sql包)sql语句。Oracle在接到这条sql之后,首先会将这个sql做一个hash函数运算,得到一个hash值,然后到共享池中寻找是否有和这个hash值匹配的sql存在。如果找到了,oracle将直接使用已经存在的sql的执行计划去执行当前的sql,然后将结果返回给用户;如果在共享池中没有找到相同hash值的sql,oracle会认为这是一条新的sql,将会按照下面的顺序来执行:
A. 语法分析
主要看这条sql是否符合oracle规定的语法规则,如果发现语法有误,将向用户抛出一个错误信息。

B. 语义分析
当语法分析通过以后,oracle将对这条sql做一些对象、权限方面的检查,查看sql中操作的表是否存在,表中的列是否正确,用户是否有操作这个对象的权限等。

C. 生成执行计划
这个过程oracle将通过一些列的操作,来做出最后sql的执行计划,比如查看操作对象的统计信息,动态采样等。

D. Sql的执行
Oracle按照上一步生成的执行计划,实际地执行sql语句,并将结果返回给用户。至此,一条sql语句执行完毕。

语法分析、语义分析、生成执行计划这些工作十分消耗资源,所以通常称为硬分析(hard parse),而直接通过相同hash值从共享池中获取执行计划则称为软分析(soft parse)。

绑定变量是什么,为什么要绑定变量?
绑定变量就其本质来说就是把本来需要oracle做硬分析的sql变成了软分析,以减少oracle花费在sql解析上的时间和资源。

6.2 为什么说OLTP必须要求变量绑定而OLAP不应该绑定变量
OLTP系统中,sql语句大多是比较简单或操作的结果集都很小。如果在这些表上创建了索引,那么这种极小结果集的操作使用索引最适合,并且几乎所有sql的执行计划中的索引都会毫无悬念地被选择。在这种执行计划几乎是唯一的情况下,oracle使用变量来代替谓词常量,使用同一个执行计划时合适的。
而OLAP系统再sql的操作中就复杂得多,OLAP数据库上大多数时候运行的是一些报表sql,这些sql经常会用到聚合查询(比如group by),而且结果集也非常庞大,在这种情况下,索引并不是必然的选择,甚至有的时候全表扫描的性能会优于索引,即使相同的sql,如果谓词条件不同,执行计划都可能不同。

我们大致可以得出下面的结论:
(1) OLAP系统完全没有必要绑定变量,那样只会带来负面的影响,比如导致sql选择了错误的执行计划,这个代价有时候是灾难性的;让oracle对每条sql做硬分析,确切地知道谓词条件的值,这对执行计划的选择至关重要,这样做的原因是,在OLAP系统中,sql硬分析的代价是可以忽略的,系统的资源基本上是用于做大的查询,和查询比较起来,sql解析消耗的资源显得微不足道。所以得到一个最优的执行计划变得尤为重要。
(2) 在OLAP系统上,让oracle确切地知道谓词的数值至关重要。它直接决定了sql执行计划的选择,这样做的方式就是不要绑定变量。
(3) 在OLAP系统中,表、索引的分析至关重要,因为它是oracle为sql做出正确的执行计划的信息来源和依据,所以需要建立一套能够满足系统要求的对对象分析的定时执行任务。


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [oracle 绑定 变量] 推荐:

<让oracle跑得更快-6> 绑定变量

- - ITeye博客
变量绑定是OLTP系统中一个非常值得关注的技术点. 良好的变量绑定会使OLTP系统数据库中的sql执行速度飞快,内存效率极高;不绑定变量可能会使OLTP数据库不堪重负,资源被sql解析严重消耗,系统显得滞重而缓慢. 6.1 什么是变量绑定,为什么要做变量绑定. 在介绍绑定变量以前,首先要介绍一下sql究竟是如何被执行的,知道了sql执行的具体细节之后,才能讨论为什么以及什么时候要做变量绑定.

什么是SQL绑定变量,如何实现绑定变量?

- - CSDN博客推荐文章
Java实现绑定变量的方法:. 假设要将id从1到10000的员工的工资都更新为150.00元,不使用绑定变量,则:. 二者区别在于,不用绑定变量,则相当于反复解析、执行了1w个sql语句. 使用绑定变量,解析sql语句只用了一次,之后的9999次复用第一次生成的执行计划. 什么时候不应该/不必要使用绑定变量.

jdbc测试mysql数据库sql预解析(绑定变量)

- - CSDN博客推荐文章
jdbc测试mysql数据库sql预解析(绑定变量).         用习惯了oracle,学习mysql,想测试一下mysql绑定变量的效果. 以前看网上介绍大部份都说mysql没有sql共享池的概念,所以也不存在sql预解析或绑定变量的说法.         今天测试了一下(通过网络抓包和看服务器端sql日志的方法),发现mysql还是有sql预解析的实现.

Oracle 收购 Ksplice

- feng823 - LinuxTOY
实现无需重启即可为 Linux 内核打安全补丁的 Ksplice 被 Oracle 收购. 在被收购前, Ksplice 为 Fedora, Ubuntu 免费提供该功能,对于 RHEL 和 CentOS 则需要订阅其产品. Oracle 表示将把 Ksplice 带来的零宕机安全更新功能添加到 Oracle 产品订阅服务中,同时停止对其他企业级 Linux 发行版的支持,将 Oracle Unbreakable Linux 打造成唯一具备零宕机安全更新功能的企业级 Linux 发行版.

Linux Ksplice,MySQL and Oracle

- Syn - DBA Notes
Oracle 在 7 月份收购了 Ksplice. 使用了 Ksplice 的 Linux 系统,为 Kernel 打补丁无需重启动,做系统维护的朋友应该明白这是一个杀手级特性. 现在该产品已经合并到 Oracle Linux 中. 目前已经有超过 700 家客户,超过 10 万套系统使用了 Ksplice (不知道国内是否已经有用户了.

oracle license计算

- Fenng - eagle&#39;s home
Oracle license的计算是基于CPU core的. 用core的数目乘以一个系数core factor就可以得到所需的oracle license的数目. 对于不同的CPU,core factor是不一样的,可以从oracle提供的这张列表中查到 Oracle Processor Core Factor Table.

Oracle Exadata初探

- - 技术改变世界 创新驱动中国 - 《程序员》官网
在我们看来,它是一个把硬件和软件根据合理的配置整合在一起的 Oracle数据库(在本文编写时是11gR2版本)平台. Exadata数据库机器包含了存储子系统,在存储层上运行着研发的新软件,这使得研发人员可以做一些在其他平台上无法完成的事情. 实际上,Exadata一开始是以一个存储系统形式诞生的,如果你跟参与研发此产品的人交谈,你经常会听到他们称存储组件为Exadata或者是SAGE (Storage Appliance for Grid Environments,网格环境存储设备),这是该产品研发项目的代码名称.

Oracle MySQL Or NoSQL续

- - Sky.Jian 朝阳的天空
接前面一篇,这里再将之前在“中国系统架构师大会”5周年的时候发布的纪念册“IT架构实录”上的一篇文章发出来,也算是前面博文中PPT的一个文字版解读吧. Oracle,MySQL 还是 NoSQL. 随着阿里系的“去IOE”运动在社区的宣传声越来越大,国内正在掀起一股“去xxx”的技术潮. 不仅仅是互联网企业,包括运营商以及金融机构都已经开始加入到这个潮流之中.

[转]Oracle 碎片

- - 小鸥的博客
  当生成一个数据库时,它会 分成称为表空间( Tablespace )的多个逻辑段( Segment ),如系统( System )表空间 , 临时( Temporary )表空间等. 一个表空间可以包含多个数据范围( Extent )和一个或多个自由范围块,即自由空间( Free Space ).

oracle 索引

- - 数据库 - ITeye博客
        自动:在使用primary和unique后系统会自动创建唯一索引.         手动:create   index   索引名  on 表名(字段1,....). 查询表上有哪些索引(网上找的,能用,表名和索引名要大写). 1、查找表的所有索引(包括索引名,类型,构成列):. select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and t.table_name = i.table_name and t.table_name = 要查询的表.