一,解析过程

  

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

  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 对结果进行排序。

  SELECT  (9) DISTINCT (11) <TOP_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
 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

 

  

           

oracle 基础知识(九)----SQL解析的更多相关文章

  1. Oracle基础知识汇总一

    Oracle基础知识 以下内容为本人的学习笔记,如需要转载,请声明原文链接   https://www.cnblogs.com/lyh1024/p/16720759.html oracle工具: SQ ...

  2. 图说Oracle基础知识(一)

    本文主要对Oralce数据库操作的基础知识进行一下梳理,以便进行归纳总结.适用于未使用过Oracle数据库的读者,或需要学习Oracle数据库方面的基础知识.如有不足之处,还请指正. 关于SQL介绍的 ...

  3. Oracle 基础知识入门

    前记: 近来项目用到Oracle数据库,大学学了点,后面基本忘记得差不多了,虽然基本语法跟sql 差不多,但是oracle知识是非常多的. 这里简单说点基础知识,希望后面补上更多的关于ORacle知识 ...

  4. Oracle体系结构概述与SQL解析剖析

    Oracle服务器 是一个数据库管理系统,它提供了一种全面.开放.集成的方法来管理信息. Oracle服务器由Oracle数据库和Oracle实例组成. oracle数据库软件和Oracle数据库软件 ...

  5. Oracle 基础知识

    SQLDevelop 1. 查看数据库版本 :  select  *  from   v$version; 2. 查看表结构:        desc     TABLE_NAME 3. 查看当前连接 ...

  6. (十九)oracle 基础使用以及sql语句基础

    oracle的安装与卸载 要记住数据库口令,适用于sys.system.sysman/dbsnmp等账户,而scott帐号密码默认为tiger, 以oracle  10g来说,scott账户默认是lo ...

  7. oracle 基础知识(三)

    一.删除oracle 进入注册表到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\OracleOraHome91TNSListener Ima ...

  8. Oracle基础知识笔记(10) 约束

    表尽管建立完毕了,可是表中的数据是否合法并不能有所检查,而假设要想针对于表中的数据做一些过滤的话,则能够通过约束完毕,约束的主要功能是保证表中的数据合法性,依照约束的分类,一共同拥有五种约束:非空约束 ...

  9. 第三周博客之一---Oracle基础知识

    一.数据库的定义.作用介绍 1.定义:按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库. 2.数据库的发展历史: 2.1.在1962年数据库一词出现在系统研发的公司的技术备忘录中 2. ...

随机推荐

  1. 编写高质量代码改善C#程序的157个建议——建议7: 将0值作为枚举的默认值

    建议7: 将0值作为枚举的默认值 允许使用的枚举类型有byte.sbyte.short.ushort.int.uint.long和ulong.应该始终将0值作为枚举类型的默认值.不过,这样做不是因为允 ...

  2. c# 半角转换为全角 判断是否是全角

    #region 半角转换为全角 /// <summary> /// 半角转换为全角 ////转全角的函数(SBC case) ///任意字符串 ///全角空格为12288,半角空格为32 ...

  3. 解决jquery操作checkbox火狐下第二次无法勾选问题

    最近在学习jQuery(版本jquery-1.9.1.js),要求用jQuery实现全选/全不选.反选,在IE(IE8)中没有问题,但在火狐浏览器中调试的时候出现了一些小问题,达不到效果. html代 ...

  4. JSP+JDBC实现在可视化页面中插入数据到SQL数据库

    原创 本篇博客创建一个如下图所示的JSP页面,将用户填入的数据插入到对应的数据库中. JSP页面代码: <%@ page language="java" contentTyp ...

  5. 中国城市 json

    点击查看完整代码,再点击复制即可复制代码. 三级json,省市区: [{ "value": "110000", "text": " ...

  6. C# 筛选Datatable、foreach填充DGV,datatable与datarows转换

    public void SelectFG1(string Nane) { string SetText = "卫材代码 like '%" + Nane + "%' or ...

  7. C# 常用正则验证[转]

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  8. C#构造函数用法

    1.实例构造函数 2.静态构造函数 3.私有构造函数 例: 创建一个类 using System; using System.Collections.Generic; using System.Lin ...

  9. subset子集全排序问题

    思路一 可以用递推的思想,观察S=[], S =[1], S = [1, 2] 时解的变化. 可以发现S=[1, 2] 的解就是 把S = [1]的所有解末尾添上2,然后再并上S = [1]里面的原有 ...

  10. Mysql初识数据库《二》数据库管理软件的由来

    数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅只能存在于某一台机器上. 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件都运 ...