<转>Oracle中的软解析和硬解析

标签: oracle 解析 解析 | 发表时间:2014-04-02 14:10 | 作者:yingbin920
出处:http://www.iteye.com
原链接: http://soft.chinabyte.com/database/468/12178468.shtml

问题一:哪个进程负责硬解析?shared pool设置不合理除了命中率低外还有哪些现象?

  说到软解析(soft prase)和硬解析(hard prase),就不能不说一下Oracle对sql的处理过程。当你发出一条sql语句交付Oracle,在执行和获取结果前,Oracle对此sql将进行几个步骤的处理过程:

  1、语法检查(syntax check)

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

  2、语义检查(semantic check)

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

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

  利用内部算法对sql进行解析,生成解析树(parse tree)及执行计划(execution plan)。

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

  其中,软、硬解析就发生在第三个过程里。

  Oracle利用内部的hash算法来取得该sql的hash值,然后在library cache里查找是否存在该hash值;

  假设存在,则将此sql与cache中的进行比较;

  假设“相同”,就将利用已有的解析树与执行计划,而省略了优化器的相关工作。这也就是软解析的过程。

  诚然,如果上面的2个假设中任有一个不成立,那么优化器都将进行创建解析树、生成执行计划的动作。这个过程就叫硬解析。

  创建解析树、生成执行计划对于sql的执行来说是开销昂贵的动作,所以,应当极力避免硬解析,尽量使用软解析。

  这就是在很多项目中,倡导开发设计人员对功能相同的代码要努力保持代码的一致性,以及要在程序中多使用绑定变量的原因。

  /****************************************************/

  问题二、大家都在说在Sql中使用了Bind Var(绑定变量)会提高不少性能,那他到底是如何提高性能的呢?

  使用了Bind Var能提高性能主要是因为这样做可以尽量避免不必要的硬分析(Hard Parse)而节约了时间,同时节约了大量的CPU资源。

  当一个Client提交一条Sql给Oracle后,Oracle 首先会对其进行解析(Parse),然后将解析结果提交给优化器(Optimiser)来进行优化而取得Oracle认为的最优的Query Plan,然后再按照这个最优的Plan来执行这个Sql语句(当然在这之中如果只需要软解析的话会少部分步骤)。

  但是,当Oracle接到 Client提交的Sql后会首先在共享池(Shared Pool)里面去查找是否有之前已经解析好的与刚接到的这一个Sql完全相同的Sql(注意这里说的是完全相同,既要求语句上的字符级别的完全相同,又要求涉及的对象也必须完全相同)。当发现有相同的以后解析器就不再对新的Sql在此解析而直接用之前解析好的结果了。这里就节约了解析时间以及解析时候消耗的CPU资源。尤其是在OLTP中运行着的大量的短小Sql,效果就会比较明显了。因为一条两条Sql的时间可能不会有多少感觉,但是当量大了以后就会有比较明显的感觉了。

  上面说到了硬解析(Hard Parse),那这个Hard Parse到底是个啥呢?

  Parse主要分为三种:

  1、Hard Parse (硬解析)

  2、Soft Parse (软解析)

  3、Soft Soft Parse(好像有些资料中并没有将这个算在其中)

  Hard Parse就是上面提到的对提交的Sql完全重新从头进行解析(当在Shared Pool中找不到时候将会进行此操作),总共有一下5个执行步骤:

  1:语法分析

  2:权限与对象检查

  3:在共享池中检查是否有完全相同的之前完全解析好的—如果存在,直接跳过4和5,运行Sql(此时算soft parse)

  4:选择执行计划

  5:产生执行计划

  Soft Parse就如果是在Shared Pool中找到了与之完全相同的Sql解析好的结果后会跳过Hard Parse中的后面的两个步骤。

  Soft Soft Parse实际上是当设置了session_cursor_cache这个参数之后,Cursor被直接Cache在当前Session的PGA中的,在解析的时候只需要对其语法分析、权限对象分析之后就可以转到PGA中查找了,如果发现完全相同的Cursor,就可以直接去取结果了,也就就是实现了 Soft Soft Parse.

  不过在计算解析次数的时候是只计算Hard Parse和Soft Parse的(其实Soft Soft Parse好像也并不能算是做了Parse ):Soft Parse百分比计算:Round(100*(1-:hprs/:prse),2) [hprs:硬解析次数;prse:解析次数] Parse比率计算: Round(100*(1-prse/exec) ,2) [exec:执行次数]

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


ITeye推荐



相关 [oracle 解析 解析] 推荐:

彻底弄懂oracle硬解析、软解析、软软解析

- - CSDN博客数据库推荐文章
     硬解析和软解析有相同的一步,而软软解析与硬解析、软解析完全不一样. 先来说下理论上的东西,然后来做个实验.     1.语法、语义及权限检查;.     2.查询转换(通过应用各种不同的转换技巧,会生成语义上等同的新的SQL语句,如count(1)会转为count(*));.     3.根据统计信息生成执行计划(找出成本最低的路径,这一步比较耗时);.

Oracle中rownum的用法解析

- - CSDN博客数据库推荐文章
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀. (1) rownum 对于等于某值的查询条件. 如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件.

<转>Oracle中的软解析和硬解析

- - Oracle - 数据库 - ITeye博客
原链接: http://soft.chinabyte.com/database/468/12178468.shtml. shared pool设置不合理除了命中率低外还有哪些现象.   说到软解析(soft prase)和硬解析(hard prase),就不能不说一下Oracle对sql的处理过程.

Oracle直接路径加载--append的深度解析

- - CSDN博客推荐文章
        ㈠ 直接路径加载和buffer cache.        直接路径插入的数据不经过buffer cache,从PGA直接把数据格式化成Oracle块.        然后由普通的Oracle Server Process进程把数据块写入数据文件.        因为不经过buffer cache,所以不需要DBWn介入.

解析DynamoDB

- - 技术改变世界 创新驱动中国 - 《程序员》官网
DynamoDB是Amazon最新发布的NoSQL产品. 本文在介绍DynamoDB特性的基础上,将其与SimpleDB、Cassandra和MongoDB进行了分析和比较. 在NoSQL概念日益火爆的今天,市场上又增加了一个重量级的NoSQL产品—DynamoDB,它是Amazon AWS于2012年1月18日发布的.

xml sax解析

- - 移动开发 - ITeye博客
最近一直在做接口,主要用对xml的解析用的是sax,下面我对sax的几种写法做了一个测试:. System.out.println("耗时:"+(end-start));. System.out.println("当前 Java 虚拟机中的使用内存量:" + (freeMemory01-freeMemory02) + " 字节");.

mysql explain 解析

- - SQL - 编程语言 - ITeye博客
Mysql Explain 详解. 例如: explain select * from t3 where id=3952602;. 二.explain输出解释. | id | select_type | table | type  | possible_keys     | key     | key_len | ref   | rows | Extra |.

java解析APK

- - Linux - 操作系统 - ITeye博客
1、结合安卓提供apktool工具,用java执行cmd解析命令获取apk信息. 2、利用相关jar包里的集成方法解析apk. 这里只给出第二种方法,因为第一种方法在linux服务器下会出现不在控制范围之内的结果. // 将解压文件对象转列举对象. // 获得名为AndroidManifest.xml的文件.

sql 解析器

- - zzm
// parser得到AST. // 将AST通过visitor输出. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

java解析xml数据---sax解析器

- - ITeye博客
下面是handler解析数据的方法. private HashMap map = null;// 存储单个解析的完整对象. private List> list = null;// 存储全部的解析对象. private String currentTag = null; // 正在解析的元素的标签.