Oracle中的硬解析与软解析原理


     用Oracle进行过实际开发的应该对硬解析与软解析并不陌生,Oracle中对这两种不同解析的使用,将直接影响到整个系统的性能。那在项目中尽量使用软解析的原因又是什么呢?首先来一起看一下这两种解析的工作过程:

     一个硬解析包括下面的步骤:

  1.      1. 加载到共享池中 - SQL源代码被加载到内存中。
  2.      2. 语法解析 - Oracle检查语法拼写错误。
  3.      3. 语义解析 - Oracle验证来自数据字典的所有表名和列名并且验证你是否有权访问这些数据。
  4.      4. 查询转换 - 如果允许(query_rewrite=true),oracle将把复杂的SQL转换为等价的简单形式。
  5.      5. 优化 - 根据模式的统计信息创建执行计划(在10g中或许会使用动态的样本统计信息)。
  6.      6. 创建可执行文件 - Oracle创建一个服务于SQL查询的、调用本地文件的可执行文件。

    

     在Oracle中软解析和硬解析的区别是什么?仅仅是上面用红色标明的第一步。也就是说,软解析不需要重新装载到共享池(以及相关的内存分配)。    

      硬解析比软解析差很多,因为它牵涉到共享池中内存的分配和管理。硬解析需要把SQL语句加载到共享池中。一旦被加载,SQL必须完全重新检查语法和语义以及生成可执行目标。

      Oracle中有一种叫做闩的锁,用来实现对Oracle所用共享数据结构的串行化访问,此处提到的共享池就是这样一个例子。共享池是系统全局区的(System Global Area, SGA)中一个庞大的共享数据结构,Oracle正是在这里存储已解析、已编译的SQL。修改这个共享结构的时候,由于闩的存在,一次只允许一个进程访问。所以,当系统中存在大量的硬解析时,每生成的一个新的SQL语句都需要加载到共享池里面,也就是对这个共享结构进行了修改,此时每次只能有一个线程来对共享池进行访问,这就导致等待时间变长,效率降低。若使用软解析,只需要加载与解析一次,不会重复的进行大量SQl的编译与解析,所以效率会大大增加。

 

转载于:https://my.oschina.net/u/200090/blog/36213

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值