oracle软解析和硬解析的常见问题

问题一:哪个进程负责硬解析?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资源。

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

当一个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:执行次数]

时间: 2025-01-07 17:26:26

oracle软解析和硬解析的常见问题的相关文章

SQL 软解析和硬解析详解

当客户端进程,将SQL语句通过监听器发送到Oracle时, 会触发一个Server process生成,来对该客户进程服务.Server process得到SQL语句之后,对SQL语句进行Hash运算,然后根据Hash值到library cache中查找,如果存在,则直接将library cache中的缓存的执行计划拿来执行,最后将执行结果返回该客户端,这种SQL解析叫做软解析:如果不存在,则会对该SQL进行解析parse,然后执行,返回结果,这种SQL解析叫做硬解析. 1.硬解析的步骤硬解析一

Oracle SQL的硬解析和软解析

我们都知道在Oracle中每条SQL语句在执行之前都需要经过解析,这里面又分为软解析和硬解析.在Oracle中存在两种类型的SQL语句,一类为 DDL语句(数据定义语言),他们是从来不会共享使用的,也就是每次执行都需要进行硬解析.还有一类就是DML语句(数据操纵语言),他们会根据情况选择要么进行硬解析,要么进行软解析. DML:INSERT,UPDATE,DELETE,SELECT DDL:CREATE,DROP,ALTER 一.QL 解析过程 Oracle对此SQL将进行几个步骤的处理过程:

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

一.摘要 Oracle硬解析和软解析是我们经常遇到的问题,所以需要考虑何时产生软解析何时产生硬解析,如何判断 SQL的执行过程 当发布一条SQL或PL/SQL命令时,Oracle会自动寻找该命令是否存在于共享池中来决定对当前的语句使用硬解析或软解析. 通常情况下,SQL语句的执行过程如下: Step1. SQL代码的语法(语法的正确性)及语义检查(对象的存在性与权限). Step2. 将SQL代码的文本进行哈希得到哈希值. Step3. 如果共享池中存在相同的哈希值,则对这个命令进一步判断是否进

Oracle中的游标、硬解析、软解析、软软解析、解析失败

Oracle中的游标.硬解析.软解析.软软解析.解析失败 一. 游标的分类及共享游标 游标(Cursor)是Oracle数据库中SQL解析和执行的载体,它可以分为共享游标(Shared Cursor)和会话游标(Session Cursor).共享游标可以细分为父游标(Parent Cursor)和子游标(Child Cursor),可以通过视图V$SQLAREA和V$SQL来查看当前缓存在库缓存(Library Cache)中的父游标和子游标,其中V$SQLAREA用于查看父游标,V$SQL用

oracle硬解析执行步骤详解

  oracle涉及一张表的查询语句,如果是第一次执行,也就是硬解析,需要执行的步骤涉及的对象如下: Tables #Queries Purpose access$ 1 Permissions used by a dependent object against its parent ccol$ 10 Constraint column-specific data cdef$ 3 Constraint-specific definition data col$ 1 Table column-sp

硬解析和物理读取与软解析和逻辑读取

参考:http://www.cnblogs.com/chinhr/archive/2009/03/14/1412100.html 001 预备知识 ·Recursive Calls:有时为了执行用户发出的一条SQL语句,Oracle必须执行额外的语句.这样的额外的语句被称为递归调用或者递归SQL语句.例如,如果你想往表中插入一行,但是该表没有足够的空间来容纳这行,这个时候Oracle就会使用递归调用来自动分配空间. ·db block gets:Number of times a CURRENT

等待模拟-library cache shared pool 硬解析

drop table test1; create table test1 (it int); insert into test1 values(10); create table test2 as select * from test1; create table test3 as select * from test1; create table test4 as select * from test1; create table test5 as select * from test1; c

android 环信json解析是怎么解析的

问题描述 android 环信json解析是怎么解析的 [msg{from:sb111111, to:sb222222 body:txt:"a"]这种的json是怎么写的,我用的是fastjson,所以我想看一下实体类的代码,求求!!! 解决方案 本文采用三种方法,解析Json文件,具体在代码那个都有解析 不多说,贴代码: ? ?// SampleActivity.java package com.yline.jsonparse; import android.app.Activity

html c++-如何读取本地html文件,并将该文件解析,根据解析的数据创建新的html

问题描述 如何读取本地html文件,并将该文件解析,根据解析的数据创建新的html 问题是这样的: 我在网上获取了别人的html源代码后,把源代码保存到本地html,然后通过什么样的方法读取到里面table的数据,再根据这些数据构建一个新的html文件,再另存到本地 相当于这么一个软件,输入时别人的html源代码,输出我重新整理好的html文件,不知道大家能不能懂--汗,我知道js是无法获得本地文件,所以只能依赖其他平台来处理html 请各位大侠给点思路,比如c++? 解决方案 java jso