• oracle 基础知识(九)----SQL解析


    一,解析过程

      

    二,硬解析,软解析,软软解析

      01,硬解析

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

          1.1,解析过程

        硬解析一般包括下面几个过程:
          1)对SQL语句进行语法检查,看是否有语法错误。比如select from where 等的拼写错误,如果存在语法错误,则推出解析过程;
          2)通过数据字典(row cache),检查SQL语句中涉及的对象和列是否存在。如果不存在,则推出解析过程。
          3)检查SQL语句的用户是否对涉及到的对象是否有权限。如果没有则推出解析;
          4)通过优化器创建一个最优的执行计划。这个过程会根据数据字典中的对象的统计信息,来计算多个执行计划的cost,从而得到一个最优的执行计划。这一步涉及到大量的数据运算,从而会消耗大量的CPU资源;(library cache最主要的目的就是通过软解析来减少这个步骤);
          5)将该游标所产生的执行计划,SQL文本等装载进library cache中的heap中。

          1.2 , 硬解析不足

        1、 硬解析可能会导致Shared Pool Latch的争用。在Shared Pool中分配内存需要持有Shared Pool Latch,如果并发的硬解析的数量很多的化,可能会导致Shared Pool Latch的争用,这会影响到系统的性能和可扩展性。

        2、 硬解析可能会导致库缓存相关Latch 和Mutex的争用

      2.软解系

        软解析是指Oracle在执行目标sql时,在Library Cache中找到了匹配的Parent Cursor和child Cursor,并将存储在Child Cursor中的解析树和执行计划直接拿过来重用,而无需从头开始解析的过程。

      3,软软解析

        当设置了session_cursor_cache这个参数之后,Cursor被直接Cache在当前Session的PGA中的,在解析的时候只需要对其语法分析、权限对象分析之后就可以转到PGA中查找了,如果发现完全相同的Cursor,就可以直接去取结果了,也就就是实现了 Soft Soft Parse.

      4,总诉

        无论是软硬解析,软软解析,Oracle在解析和执行sql时候,首先会到PGA中查找是否有匹配的session cursor,如果在当前PGA没有找到,则会到库缓存 查找是否有匹配的父子游标,如果找不到,就是生成一个新的session cursor和一对父子游标,如果找到父游标,没有找到子游标,就会生成,session cursor和子游标,挂在父游标下,这两种情况都是硬解析。 如果在PGA没有找到session cursor,但在库缓存找到父子游标,则生成一个新的session cursor,重用父子游标。如果在PGA找到,并在库缓存也找到,就是软软解析了。

    三,sql执行的顺序

                       1、from子句:组装来自不同表、视图等数据源的数据。

                         2、where子句基于指定的过滤条件对记录进行筛选。

                         3、group by子句:将数据划分为多个组。

                         4、使用狙击函数的计算。

                         5、使用having子句筛选分组。

                         6、计算所有表达式。

                         7、select 产生字段。

                         8、使用order by 对结果进行排序。

    1  SELECT  (9) DISTINCT (11) <TOP_specification> <select_list> 
    2  (1)  FROM <left_table>  
    3  (3) <join_type> JOIN <right_table> 
    4  (2) ON <join_condition> 
    5  (4) WHERE <where_condition> 
    6  (5) GROUP BY <group_by_list> 
    7  (6) WITH {CUBE | ROLLUP} 
    8  (7) HAVING <having_condition> 
    9  (10) ORDER BY <order_by_list>
    View Code
     1、 FROM:对FROM子句中的前两个表执行笛卡尔积(交叉联接),生成虚拟表VT1。
    
    2、 ON:对VT1应用ON筛选器,只有那些使为真才被插入到TV2。
    
    3、 OUTER (JOIN):如果指定了OUTER JOIN(相对于CROSS JOIN或INNER JOIN),保留表中未找到匹配的行将作为外部行添加到VT2,生成TV3。如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表位置。
      
    4、 WHERE:对TV3应用WHERE筛选器,只有使为true的行才插入TV4。
    
    5、 GROUP BY:按GROUP BY子句中的列列表对TV4中的行进行分组,生成TV5。
    
    6、 CUTE|ROLLUP:把超组插入VT5,生成VT6。
    
    7、 HAVING:对VT6应用HAVING筛选器,只有使为true的组插入到VT7。
    
    8、 SELECT:处理SELECT列表,产生VT8。
    
    9、 DISTINCT:将重复的行从VT8中删除,产品VT9。
    
    10、ORDER BY:将VT9中的行按ORDER BY子句中的列列表顺序,生成一个游标(VC10)。
    
    11、TOP:从VC10的开始处选择指定数量或比例的行,生成表TV11,并返回给调用者。
    来自于:>>jlins

     

      

               

  • 相关阅读:
    Shell 函数
    Shell 流程控制
    Shell test 命令
    Shell echo命令
    python 类、模块、包的区别
    postgresql vacuum table
    ssh连接断开后 shell进程退出
    ubuntu 搭建 svn服务器,使用http方式访问
    如何查看apache加载了哪些模块
    maven 的使用
  • 原文地址:https://www.cnblogs.com/kingle-study/p/10444545.html
Copyright © 2020-2023  润新知