`

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

阅读更多
原链接: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:执行次数]
分享到:
评论

相关推荐

    Oracle 主要配置文件介绍

    (SID_NAME = cams)&lt;br&gt; )&lt;br&gt; (SID_DESC =&lt;br&gt; (GLOBAL_DBNAME = oid)&lt;br&gt; (ORACLE_HOME = /u01/app/oracle/product/8.1.7)&lt;br&gt; (SID_NAME = oid)&lt;br&gt; )&lt;br&gt;)&lt;br&gt;&lt;br&gt;& 说明&lt;br&gt;1 listener.ora 文件中定义一个监听器...

    PHP教程

    &lt;br&gt;第三章 语法 &lt;br&gt;语法简述 &lt;br&gt;hello, world &lt;br&gt;嵌入方法 &lt;br&gt;引用文件 &lt;br&gt;程序注释 &lt;br&gt;常量与变量 &lt;br&gt;常量类型 &lt;br&gt;变量类型 &lt;br&gt;变量的使用 &lt;br&gt;运算符号 &lt;br&gt;算术运算 &lt;br&gt;字符串运算 &lt;br&gt;赋值运算 &lt;br&gt;...

    C#编程经验技巧宝典

    58&lt;br&gt;&lt;br&gt;0081 文本中首字母改为大写 59&lt;br&gt;&lt;br&gt;0082 C#随机数的产生 59&lt;br&gt;&lt;br&gt;0083 身份证从15位升至18位算法 60&lt;br&gt;&lt;br&gt;0084 十进制数转二进制数的算法 60&lt;br&gt;&lt;br&gt;0085 十进制数转八进制数的算法 61...

    Oracle中的硬解析与软解析

    Oracle中的硬解析与软解析,二者的本质区别

    Oracle 硬解析与软解析.pdf

    Oracle 硬解析与软解析

    SQL智能完成工具BDB

    &lt;br&gt;&lt;br&gt;&lt;br&gt;一、使用&lt;br&gt;&lt;br&gt;运行BDB,切换至“查询分析”页签,&lt;br&gt;您可以按CTRL+J快捷键列出选择项&lt;br&gt;(默认,可在“选项”中进行更改),&lt;br&gt;&lt;br&gt;或直接输入语法,&lt;br&gt;系统会根据当前输入的字符进行智能搜索,...

    AppFramework_V1.0

    &lt;br&gt;查询结果集(平均101行)&lt;br&gt;&lt;br&gt;(1循环200次select)&lt;br&gt; 1055.1&lt;br&gt; 666.8&lt;br&gt;&lt;br&gt;不定字段:710.1&lt;br&gt; 1.58&lt;br&gt;&lt;br&gt;1.50&lt;br&gt; &lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;表III –50并发10循环(数据库和测试机同机)&lt;br&gt;&lt;br&gt;对比项目&lt;br...

    AppFramework_V1.0_New

    14.5&lt;br&gt;1.32&lt;br&gt;&lt;br&gt;1.21&lt;br&gt;&lt;br&gt;插入实体&lt;br&gt;&lt;br&gt;(20次insert)&lt;br&gt;36.1&lt;br&gt;17.4&lt;br&gt;2.07&lt;br&gt;&lt;br&gt;更新实体&lt;br&gt;&lt;br&gt;(20次单条update)&lt;br&gt;23.5&lt;br&gt;15.9&lt;br&gt;&lt;br&gt;SqlMap:20.3&lt;br&gt;1.48&lt;br&gt;&lt;br&gt;1.16&lt;br&gt;&lt;br&gt;查询结果集...

    Step by step配置Oracle Stream

    Oracle Stream利用高级队列技术,通过解析归档日志,将归&lt;br&gt;档日志解析成DDL 及DML 语句,从而实现数据库之间的同步。这种技术可以将整个数据&lt;br&gt;库、数据库中的对象复制到另一数据库中,通过使用Stream 的技术,对...

    AppFramework数据库访问组件_代码生成插件_V1.1.rar

    18.0&lt;br&gt;1.23&lt;br&gt;&lt;br&gt;1.10&lt;br&gt;&lt;br&gt;每秒插入实体&lt;br&gt;&lt;br&gt;(20次insert)&lt;br&gt;41&lt;br&gt;21&lt;br&gt;1.95&lt;br&gt;&lt;br&gt;更新实体&lt;br&gt;&lt;br&gt;(20次单条update)&lt;br&gt;27&lt;br&gt;19&lt;br&gt;&lt;br&gt;SqlMap:24&lt;br&gt;1.42&lt;br&gt;&lt;br&gt;1.13&lt;br&gt;&lt;br&gt;查询结果集(平均101...

    oracle-查找硬解析问题SQL语句

    在数据库中硬解析是万恶之源,为大家提供一个查找并且定位oracle硬解析问题SQL语句脚本

    全功能的数据库工具BDB v2.8

    &lt;br&gt;支持Oracle、SQLServer、MySQL、Access、SQLAnywhere和Sybase。&lt;br&gt;&lt;br&gt;BDB同时是非常好用的SQL智能化查询分析工具。&lt;br&gt;&lt;br&gt;如果您目前使用的是SQLServer的查询分析器进行数据库数据查询分析,&lt;br&gt;那么不妨试...

    oracle 范文http request接口获取XML,创建表 并把样例结果入库

    &lt;string&gt;name&lt;/string&gt; &lt;string&gt;字段名称&lt;/string&gt; &lt;/entry&gt; &lt;entry&gt; &lt;string&gt;alias&lt;/string&gt; &lt;string&gt;中文备注&lt;/string&gt; &lt;/entry&gt; &lt;entry&gt; &lt;string&gt;value&lt;/string&gt; &lt;string&gt;数据值&lt;/string&gt; &lt;/entry&gt; &...

    X3BLOG v0.7.5.0

    必须在修改过的档案&lt;br&gt;&lt;br&gt;中附有明显的说明:您修改了此一档案及任何修改的日期。 您必须让您发布或出版的作品,包括本程式的全部或一部分,或内含本程式的全部或部分所衍生的作品,允许第三方在&lt;br&gt;&lt;br&gt;此许可证...

    X3BLOG 单用户版 FOR ACCESS 1.0beta 源代码

    &lt;br&gt;&lt;br&gt;功能与特点&lt;br&gt;&lt;br&gt; X3-BLOG完美的利用了浏览器的XML解析技术,完全实现数据和界面的分离,使网络传输数据量大大减少,加载速度远远超过了市面上所有的BLOG产品,有效的减轻了服务器的带宽压力,服务器端...

    X3BLOG 单用户版 1.0 build80707 (access)

    &lt;br&gt;&lt;br&gt;功能与特点&lt;br&gt;&lt;br&gt; X3BLOG完美的利用了浏览器的XML解析技术,完全实现数据和界面的分离,使网络传输数据量大大减少,加载速度远远超过了市面上所有的BLOG产品,有效的减轻了服务器的带宽压力,服务器端使用...

    睿思bi开源版后台系统,基于Springboot构建,快速分析数据及可视化,0代码编写+源代码+文档说明

    1.数据建模 (支持:mysql/oracle/sqlserver/db2/postgresql/hive/kylin) &lt;br&gt; 2.多维分析 &lt;br&gt; 3.数据报表 &lt;br&gt; 4.权限管理 &lt;br&gt;## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请...

    Oracle硬解析和软解析的区别分析

    Oracle硬解析和软解析是我们经常遇到的问题,所以需要考虑何时产生软解析何时产生硬解析,如何判断 SQL的执行过程 当发布一条SQL或PL/SQL命令时,Oracle会自动寻找该命令是否存在于共享池中来决定对当前的语句使用硬...

    用于Oracle数据库中四种应用类型(硬解析,软解析,软软解析,一次解析、多次执行)的实测性能对比

    oracle性能优化

    oracle SQL疑难解析 书中SQL

    oracle SQL疑难解析 书中SQL 付书SQL oracle-sql-recipes-master

Global site tag (gtag.js) - Google Analytics