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


     用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的编译与解析,因此效率会大大增长。spa

相关文章
相关标签/搜索