说到软解析(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的执行来说是开销昂贵的动作,所以,应当极力避免硬解析,尽量使用软解析。

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

有如下两句查询语句:

1.SELECT * FROM EMP WHERE EMPNO = 123;
2.SELECT * FROM EMP WHERE EMPNO = :EMP_NO;

1句中查询员工编号是123的员工信息,ORACLE第一次经过分析编译后执行。但如果下次还要再查询编号为456和789的员工信息时,ORACLE将会再将这句SQL分析编译,然后再执行。

再看2句,首先定义变量EMP_NO,我们将123赋给变量,第一次的时候也是经过分析编译后再执行,但是到了接下来再想查询其他员工编号的信息时,ORACLE会将第一次编译后的查询方案(在第一次编译执行之后已经储存在共享池中)用来进行下一次的查询。

这就像JAVA,想想看,如果你用JAVA写了一个软件,给客户的是你写的JAVA代码,客户在每次使用的时候都耀编译代码,然后执行。这将会影响多大啊。

所以说,分析一个带有硬编码变量的语句(称为硬分析)要明显的比重用一个已经分析过的查询方案(软分析)要花费更长的时间和耗费更多的资源。

如果使用绑定变量,提交引用相同变量的完全相同的查询的人将会使用共享池中的编译方案,只需编译子例程一次,就可以重复使用。这样不仅可以使用较少的时间,而且可以减少锁存时间,降低锁存频率。这将会提高软件性能,大大提高可伸缩性。

下面的试验将更能说明这个道理:

代码

ALTER SYSTEM FLUSH SHARED_POOL;

SET SERVEROUTPUT ON;

SET TIMING ON;

DECLARE
TYPE rc IS REF CURSOR;
l_rc rc;
l_dummy all_objects.object_name%TYPE;
l_start NUMBER DEFAULT dbms_utility.get_time;
BEGIN
FOR i IN 1 .. 1000 LOOP
OPEN l_rc FOR 'select object_name from all_objects where object_id = '||i;
FETCH l_rc INTO l_dummy;
CLOSE l_rc;
END LOOP;
dbms_output.put_line(round((dbms_utility.get_time-l_start)/100,2)|| 'seconds ...');
END;

PL/SQL 过程已成功完成。

已用时间:   00: 00: 53.05

上述代码使用动态SQL从ALL_OBJECTS表中查询单行。它用值1,2,3.......1000等硬编码产生1000条不同的查询进入WHERE子句,看看运行时间53秒。
再看下面代码:

代码

DECLARE
TYPE rc IS REF CURSOR;
l_rc rc;
l_dummy all_objects.object_name%TYPE;
l_start NUMBER DEFAULT dbms_utility.get_time;
BEGIN
FOR i IN 1 .. 1000 LOOP
OPEN l_rc FOR 'select object_name from all_objects where object_id = :x' USING i;
FETCH l_rc INTO l_dummy;
CLOSE l_rc;
END LOOP;
dbms_output.put_line(round((dbms_utility.get_time-l_start)/100,2)|| 'seconds ...');
END;

PL/SQL 过程已成功完成。
已用时间:   00: 00: 00.03

!!!!!!!    0.03秒,差距竟然这么大,回头看代码,第二次只是在循环体中使用了变量X,将i的值赋给了X,这样一来,ORACLE在执行的时候只需要编译一次,其他999次都是从共享池中使用查询方案,查询时间和速度当然更快了。
所以。从软件开发的一开始就要认识到绑定变量的重要性。

Oracle的软解析(soft prase)和硬解析(hard prase)相关推荐

  1. oracle 硬解析过高,过度硬解析导致share pool latch争用

    数据库巡检过程中发现latch争用很厉害: 原因是硬解析过高: TOP5等待: QQ截图20130918145534.jpg (35.56 KB, 下载次数: 21) 2013-9-18 14:55 ...

  2. 详解ORACLE数据库硬解析、软解析、软软解析

    概述 TOM大叔的调优书中说过一句话,大概意思就是:如果有人让我写本怎样让ORACLE性能最慢的书的话我会将取消绑定变量(bind variable)做为书的第一章和最后一章,可见绑定变量的重要性.而 ...

  3. Oracle sql解析类型, 软解析和硬解析浅析

    这篇文章是参考加甲骨论老相老师视频所做的学习笔记: http://www.jiagulun.com/thread-2675-1-1.html Sql 执行的流程分成3部分: 解析部分(Parse): ...

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

    硬解析和软解析有相同的一步,而软软解析与硬解析.软解析完全不一样.先来说下理论上的东西,然后来做个实验. 硬解析过程: 1.语法.语义及权限检查: 2.查询转换(通过应用各种不同的转换技巧,会生成语义 ...

  5. PLSQL_解析过程及硬解析和软解析的区别(案例)

    2014-08-11 Created By BaoXinjian 一.摘要 Oracle硬解析和软解析是我们经常遇到的问题,所以需要考虑何时产生软解析何时产生硬解析,如何判断 1. SQL的执行过程 ...

  6. 【Oracle】硬解析、软解析和软软解析

    [Oracle]硬解析.软解析和软软解析 前言   在 Oracle 中,每条 SQL 语句在执行之前都需要经过解析(Parse),根据解析的过程可以分为 3 种类型:硬解析(Hard Parse). ...

  7. Oracle硬解析,软解析,软软解析介绍

    Oracle数据库中的CURSOR分为两种类型:Shared Cursor 和 Session Cursor 1,Shared Cursor Oracle里的第一种类型的Cursor就是Shared ...

  8. Oracle进阶学习3:SQL语句解析类型——硬解析和软解析

    文章目录 硬解析和软解析 shared pool功能 shared pool组成 SQL语句 硬解析和软解析 Oracle数据信息全部存储在数据字典中, Oracle的解析有两种,软解析以及硬解析 硬 ...

  9. mysql 硬解析 软解析_ORACLE sql语句的硬解析与软解析(收藏)

    我们都知道在Oracle中每条SQL语句在执行之前都需要经过解析,这里面又分为软解析和硬解析.那么这两种解析有何不同之处呢?它们又分别是如何进行解析呢?Oracle内部解析的步骤又是如何进行的呢?下面 ...

  10. SQL解析之硬解析和软解析

    当客户端进程,将SQL语句通过监听器发送到Oracle时, 会触发一个Server process生成,来对该客户进程服务.Server process得到SQL语句之后,对SQL语句进行Hash运算 ...

最新文章

  1. TIOBE 1月编程语言排行榜:C语言再度「C 位」出道,Python惜败
  2. 实现将字符串转换为指令执行
  3. pycharm中使用scrapy命命
  4. 分享几个可供学习,休闲的网站
  5. python之socket网络编程
  6. Python win32com模块安装
  7. 计算机显示无法格式化,SD卡无法格式化怎么办
  8. Activity详解三 启动activity并返回结果 转载 https://www.cnblogs.com/androidWuYou/p/5886991.html...
  9. snapchat注册不到_如何将链接添加到您的Snapchat快照
  10. 一个优秀的商业分析师是如何炼成的
  11. 江西应用技术职业学院计算机协会,江西应用技术职业学院47个学生社团陆续召开动员大会...
  12. 深度学习之图像隐写去除(DDSP模型 Steganography Removal)
  13. IDEA maven 项目 POM文件变灰色或有个虫子(蜘蛛标记)
  14. 布兰迪斯大学计算机美国大学排名,布兰迪斯大学排名
  15. 完全用GNU/Linux工作,摈弃Windows---你我共勉 (转)
  16. 《计算机网络技术》第一章测试(题目及答案)
  17. java 调用麦克风录音_Java 实现麦克风自动录音
  18. 周志明:《凤凰架构:构建可靠的大型分布式系统》
  19. 新一代iPad比iPad2热的5大原因
  20. TM1637调试记录

热门文章

  1. 初中英语知识水平测试软件,美国初中生英文水平测试!百个单词检测,看看你认识几个...
  2. day2 标识符 字面值 变量 数据类型
  3. mysql修改frm,MySQL 修改.frm文件来更新字段
  4. Codeforces 417 D. Cunning Gena
  5. Swap(交换函数)
  6. linux 清除swap 数据,linux清除swap
  7. 作为IT人,你不可不知的 DevOps
  8. 同一个按钮点击多次不同效果_如何解决竞价推广中的恶意点击?
  9. 编程学习网站 收集于网络
  10. 【网络安全学习实践】Windows基本DOS文件命令与简易病毒编写