zoukankan      html  css  js  c++  java
  • ORACLE SQL执行步骤

     以前理解的

     ORACLE sql 的处理过程大致如下:

     1.运用HASH算法,得到一个HASH值,这个值可以通过V$SQLAREA.HASH_VALUE 查看

     2.到shared pool 中的 library cache 中查找是否有相同的HASH值,如果存在,则无需硬解析,进行软解析

     3.如果shared pool不存在此HASH值,则进行语法检查,查看是否有语法错误

     4.如果没有语法错误,就进行语义检查,检查该SQL引用的对象是否存在,该用户是否具有访问该对象的权限

     5.如果没有语义错误,对该SQL进行解析,生成解析树,执行计划

     6.生成ORACLE能运行的二进制代码,运行该代码并且返回结果给用户

    硬解析和软解析都在第5步进行

    硬解析通常是昂贵的操作,大约占整个SQL执行的70%左右的时间,硬解析会生成执行树,执行计划,等等。

    当再次执行同一条SQL语句的时候,由于发现library cache中有相同的HASH值,这个时候不会硬解析,而会软解析,

    那么软解析究竟是干了什么呢?其实软解析就是跳过了生成解析树,生成执行计划这个耗时又耗CPU的操作,直接利用生成的执行计划运行

    该SQL语句。

    下面摘抄eygle深入解析ORACLE 中关于SQL执行过程的描述

      1.首先获得library cache latch,根据SQL的HASH_VALUE在library cache中查找是否存在此HASH_VALUE,如果找到这个HASH_VALUE,称之为软解析,Server获得改SQL执行计划转向第4步,如果找不到共享代码就进行硬解析。

      2.释放library pool cache,获得shared pool latch,查找并锁定自由空间(在bucket 中查找chunk)。如果找不到,报ORA-04031错误

      3.释放shared pool latch,重新获得library cache latch,将SQL执行计划放入library cache中。

      4.释放library cache latch,保持null模式的library cache pin/lock.

      5.开始执行。

    Library cache latch可以理解为硬/软解析的时候发生的,因为解析的时候会搜索library cache,所以会产生library cache latch

    Library cache pin 是在执行的阶段发生的。

     现在理解的

    1.语法检查

    2.语义检查(检查执行该SQL语句的用户是否有权限访问某个对象) 

    3.检查该SQL是否存在于共享池

    4.如果SQL语句不存在就对该SQL进行硬解析,生成执行计划,解析树等等,如果SQL语句存在,就选择最佳执行计划,这个就是软解析

    5.生成Oracle能运行的二进制代码,返回结果

     以前以为一条SQL语句的执行,会首先对他进行HASH运算,后来发现错了,一条SQL语句的运行首先会在PGA中进行语法检查,语义检查

     步骤1,2都是在PGA中完成的. 

  • 相关阅读:
    小节 +三元表达式
    continue
    break
    flag标签
    #region #endregion
    for 循环
    do while 有例句体会循环的真正原理
    while 循环
    前缀和与差分
    递归的循环实现
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330682.html
Copyright © 2011-2022 走看看