下图显示了SQL在Oracle内部处理的一般阶段:解析、优化、产生行源和执行。数据库可能会忽略某些步骤,这取决于具体的语句。                                                                                                       
1,SQL解析
     SQL处理的第一阶段就是SQL解析。当应用程序发出SQL语句时,该应用程序向数据库发出一个解析调用,以准备执行该语句,解析调用会打开或创建一个游标,它是一个对特定于会话的私有SQL区的句柄,其中包含了已分析的SQL语句和其他处理信息。游标和私有SQL区位于PGA中。
     解析调用期间,数据库会执行以下检查:
          ● 语法检查     
          ● 语义检查       --对象和列是否存在
          ● 共享池检查
     数据库执行共享池检查,以确定时候可以跳过占用大量资源的语句处理步骤。为此,数据库使用一种哈希算法为每个SQL语句生成一个哈希值。语句的哈希值即是在V$SQL.SQL_ID中显示的SQL_ID(参考笔记:区分4个与sql相关的字段:hash_value、sql_hash_value、plan_hash_value 和 sql_id),当用户提交一个SQL语句时,数据库搜索共享SQL区,以查看是否存在一个现成的已分析的语句具有相同的哈希值。SQL语句的哈希值有别于下列值:
     ● 该语句的内存地址值(V$sql的address字段值)
     ● 该语句执行计划的哈希值(V$SQL_PLAN视图的plan_hash_value字段值)
 
     基于所提交语句的类型和哈希检查的结果,解析操作分为以下类别:
     ● 硬解析
        如果数据库不能重用现有代码,则它必须生成应用程序代码的一个新的可执行版本,次操作称为一个硬解析,或库缓存未命中。数据库对DDL始终执行硬解析。
        在硬解析期间,数据库多次访问库缓存和数据字典缓存以检查数据字典。当数据库访问这些区域时,它在所需对象上使用一个叫做闩锁的串行化设备,以便它们的定义不糊被更改。闩锁的争用会增加语句的执行时间,并降低并发性。
     ● 软解析
         任何不适硬解析的解析都是软解析。如果提交的语句与在共享式中某个可重用SQL语句相同,则数据库将重用该现有代码。重用代码也称为库缓存命中
         一般的,软解析比硬解析更可取,因为数据库可以跳过优化和行源生成步骤,而直接进入到直行阶段。下图是在专用服务器体系结构中,一个update语句的共享池检查的简化表示。
           
     (看来,SQL文本的哈希值是在PGA中产生的)。
          如果检查到共享库中有一个语句具有相同的哈希值,则数据库在执行语义和环境检查(工作区大小或优化器设置等),当然还有语句本身的书写(大小写,空格,注释等)。
     详情可参见笔记:《Oracle性能调优之硬解析与软解析》
 
2,SQL优化
     查询优化是选择执行SQL语句的最有效手段的过程。数据库对查询的优化基于对正在访问的实际数据收集的统计信息。优化器使用行数、数据集大小 和 其他因素来生成各种可能的执行计划,并为每个计划分配一个成本值。数据库会使用具有最低成本的计划。
     数据库对每个唯一的DML语句必须至少执行一次硬解析,并在硬解析期间执行优化。DDL永远不会被优化,除非他包括需要优化的DML组件,如子查询。
 
3,SQL行源生成
     行源生成器是一种软件,它从优化器接受经过优化的执行计划,并生成一个称为查询计划的迭代计划,一共数据库的其余部分使用。查询计划采用组合多个步骤的形式,每一步返回一个行集。该集合中的行可以在下一步被使用,火灾最后一步返回给发出SQL语句的应用程序。
     行源就是执行计划中的某一步多返回的行集,且带有能够迭代该行集的控制结构,行源可以是表、视图、或连接操作或分组操作的结果。
     行源生成器产生一个行源树,它是一个行源的集合。(就是我们看到的执行计划)
 
4,SQL执行
     在执行期间,SQL引擎执行行源生成器所产生的数中的每个行源。这一步是在DML处理中唯一的强制性步骤。在执行计划中,我们经常看到就是的一个执行树,显示了行源从一部流向另一步。通常,执行步骤的顺序与几乎是顺序相反,所以我们应该从底向上来阅读计划。在operation列中的初始空格表示层次结构关系。例如,如果一个操作的名称前面有两个空格,则此操作是前面有一个空格的操作的子操作。前面有一个空格的操作是select语句本身的子操作。
 
参考:http://docs.oracle.com/cd/E11882_01/server.112/e40540/sqllangu.htm#CNCPT216

SQL在Oracle内部的具体处理流程的更多相关文章

  1. [源码分析] 带你梳理 Flink SQL / Table API内部执行流程

    [源码分析] 带你梳理 Flink SQL / Table API内部执行流程 目录 [源码分析] 带你梳理 Flink SQL / Table API内部执行流程 0x00 摘要 0x01 Apac ...

  2. SQL优化(Oracle)

    (转)SQL优化原则 一.问题的提出 在应用系统开发初期.因为开发数据库数据比較少.对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,可是假设将应用系统提交实际应用后,随着数 ...

  3. Sql for Oracle基本操作关键字

    Sql for Oracle基本操作关键字 +SQL TOP子句 TOP 子句用于规定要返回的记录的数目 SELECT column_name(s) FROM table_name WHERE ROW ...

  4. 浅谈SQL Server数据内部表现形式

    在上篇文章 浅谈SQL Server内部运行机制 中,与大家分享了SQL Server内部运行机制,通过上次的分享,相信大家已经能解决如下几个问题: 1.SQL Server 体系结构由哪几部分组成? ...

  5. Oracle内部latch获取函数简介

      标签: oracle call 函数   oracle statpack   转自: http://blog.51cto.com/458302/998775 Oracle的内部函数一直非常神秘,其 ...

  6. SQL优化——ORACLE

    SQL优化——ORACLE 索引是由Oracle维护的可选结构,为数据提供快速的访问.准确地判断在什么地方需要使用索引是困难的,使用索引有利于调节检索速度. 当建立一个索引时,必须指定用于跟踪的表名以 ...

  7. 【SQL】Oracle分页查询的三种方法

    [SQL]Oracle分页查询的三种方法 采用伪列 rownum 查询前10条记录 ? 1 2 3 4 5 6 7 8 9 10 11 [sql] select * from t_user t whe ...

  8. 历尽磨难之PL/SQL链接Oracle数据库

    说起来都是泪啊,上司布置的任务需要远程连接Oracle数据库,说实话这又是我人生中的第一次.我听到以后觉得不是什么大问题,然而我错了..错的很厉害! 我搞了一天一夜才弄好,这里面原因有很多,大体来讲还 ...

  9. General Ledger Useful SQL Scripts – Oracle Applications 11i

    General Ledger Useful SQL Scripts – Oracle Applications 11i Contents GL Set of Books Configuration O ...

随机推荐

  1. 2019年开发App记录

    Pod 制作私有库参考 https://www.jianshu.com/p/f903ecf8e882 Pod私有库的升级 改代码部分,到Example文件夹执行pod install ,修改XXX.s ...

  2. Mysql数据库常见试题

    引用自http://blog.csdn.net/laoniyouxi123/article/details/51161157 sql语句应该考虑哪些安全性? 答: (1)防止sql注入,对特殊字符进行 ...

  3. 每隔2分钟,div元素顺序淡入

    我们的官网,是游戏网站,需要很多的动画效果,下面就开写一个box有n个元素,这些元素顺序淡入,每隔2分钟,执行一次,代码开始: <div></div> <div>& ...

  4. github 的 fork 取消功能

    进入该 fork 目录后 找到 Settings 点击后拉到底 找到含有 Delete 字样的按钮点击 弹出的对话框输入你删除的这个项目名 后删除 链接

  5. IIS发布mvc网站需操作的内容

    VS2010 WEB部署,先在IIS中创建站点,站点创建需注意以下的内容,创建完成后点击[发布]---[WEB部署]--[发布]. 在IIS7下部署MVC已经简化了许多,基本按照一般的项目部署即可,下 ...

  6. SQL 基本查询语句

    --使用数据库 use date go --创建表班级表 create table classInfo ( classNo ,),--主键约束使用primary key identity classN ...

  7. SQLSTATE[HY000] [2002] No such file or directory

    正常的解决办法.. 只需将laravel配置文件中的host 127.0.0.1改成localhost就可以: 'mysql' => array(            'driver'    ...

  8. ListView 九宫格布局实现

    1.效果图 2.数据 SettingData.json { "data": [{ "icon":"setting", "title ...

  9. 使用Mybatis执行sql脚本

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  10. PhantomJs 与 Casperjs

    利用PhantomJS做网页截图经济适用,但其API较少,做其他功能就比较吃力了. CasperJs是对phantomjs的一次封装.即phantomjs是原生的,而casperjs是封装在以phan ...