会计考友 发表于 2012-8-4 13:54:49

Oracle辅导:Oracle的硬解析和软解析

说到软解析(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(仿佛有些资料中并没有将这个算在此鱿俯

会计考友 发表于 2012-8-4 13:54:50

Oracle辅导:Oracle的硬解析和软解析

  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) Parse比率计较: Round(100*(1-prse/exec) ,2)
  /*****************************************************/
  quote from difference between soft parse and hard parse  
  -- Thanks for the question regarding "difference between soft parse and hard parse", version 8.1.7.2
  originally submitted on 26-Jan-2002 19:17 Eastern US time, last updated 5-Aug-2004 13:07
  Hi Tom
  Can you explain briefly the difference between soft and hard parse?
  你能不能给我具体介绍一下软解析与硬解析的区别啊?
   and we said……
  Here is a long winded answer, it is extracted in part from a new book oming out soon "beginning Oracle programming" that I collaborated on:这是一个很长的诠释,是年夜我与几个同事一路合著的新书中提掏出来的。
  Parsing解析
  This is the first step in the processing of any statement in Oracle. Parsing is the act of breaking the submitted statement down into its component parts ? determining what type of statement it is (query, DML, DDL) and performing various checks on it.这是Oracle措置所有语句的第一步,解析就是将用户提交的语句(按照必然的轨则)分成分歧的组件,来确定章条语句是什么类型的语句(query,发芽,DML,数据独霸说话,DDL仍是数据界说说话),以对这条语句执行各类分歧的语法检测。
  The parsing process performs two main functions:解析过程首要有一下两个功能。
  Syntax Check: is the statement a valid one? Does it make sense given the SQL grammar documented in the SQL Reference Manual. Does it follow all of the rules for SQL. 1. 语法搜检,这条语句是否合理? 它是否合适SQL语法文档的相关语法,是不是合适SQL语句的所有轨则。
  o Semantic Analysis: Going beyond the syntax ? is the statement valid in light of the objects in the database (do the tables and columns referenced exist)。 Do you have access to the objects ? are the proper privileges in place? Are there ambiguities in the statement ? for example if there are two tables T1 and T2 and both have a column X, the query ?select X from T1, T2 where ?? is ambiguous, we don?t know which table to get X from. And so on. 2.语义剖析: 已经措置完语法搜检了吗? 这条语句是否正确的引用了数据库中对象(是否语句中所有的表和字段都存在)。 是否有访谒这些对象的权限? 是不是对应的权限都有用(首要指role对应的权限吧,)? 好比是否有如下的两个表T1,T2,而这两个表有不异的字段名column X,而发芽语句 ? select X from T1,T2 where ??,(没有明晰指定列名),我们无法知道年夜哪个表去掏出字段X的值,以及近似的一系列问题。
  So, you can think of parsing as basically a two step process, that of a syntax check to check the validity of the statement and that of a semantic check ? to ensure the statement can execute properly. The difference between the two types of checks are hard for you to see ? Oracle does not come back and say ?it failed the syntax check?, rather it returns the statement with a error code and message. So for example, this statement fails with a syntax error:是以,你可以认为解析根基上是由这两个轨范组成的: 搜检语句有用性的语法搜检和确保语句能够正常运行的语义搜检。这两种搜检的区别就是你所要说的硬解析了。Oracle不会出格的指出这条语句没有经由过程语法搜检,它给你返回这条语句对应的错误代码和错误信息。 好比: 下面这条语句没有经由过程语法搜检。
页: [1]
查看完整版本: Oracle辅导:Oracle的硬解析和软解析