下图显示了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. java:在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作

    在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作 //在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作 List<String> a ...

  2. hdu 6214 : Smallest Minimum Cut 【网络流】

    题目链接 ISAP写法 #include <bits/stdc++.h> using namespace std; typedef long long LL; namespace Fast ...

  3. node.js从入门到起飞

    第一个node程序: 首先创建一个js文件,命名index.js(可随意),然后在文件里面输入 : console.log("Hello World"); 使用 Git Bash ...

  4. LTM_本地流量管理(一)

    基本元素及概念 Node:节点,即服务器的IP地址. Member:成员,即一个服务,用IP+端口表示. Pool:池:一个或多个Member的逻辑分组,一个Pool表示一个应用,每个Pool都有自己 ...

  5. ckeditor实现WORD粘贴图片自动上传,jsp应用

    官网地址http://ueditor.baidu.com Git 地址 https://github.com/fex-team/ueditor 参考博客地址 http://blog.ncmem.com ...

  6. OpenCV Mat&Operations

    /*M/////////////////////////////////////////////////////////////////////////////////////////// IMPOR ...

  7. 3D Computer Grapihcs Using OpenGL - 06 Vertex and Fragment Shaders

    从这里就接触到了可编程图形渲染管线. 下面介绍使用Vertex Shader (顶点着色器)和 Fragment Shader(像素着色器)的方法. 我们的目标是使用这两个着色器给三角形填充绿色. 添 ...

  8. spring boot 集成 mybatis 单元测试Dao层 控制台报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

    最近帮同学做毕业程序,采用后端spring boot + mybatis + H2,将框架搭好进行各层的单元测试时,在dao层就出现了错,如图 于是在网上找各种资料,有的说是xml文件和接口没有一一对 ...

  9. 9-10 November

    cout 和 printf 在 C++ 中的实现:四舍六入五随缘.比如 printf("%.0lf\n", x=1.5) => 1. 标准做法:printf("%d ...

  10. JavaScript公共库event-stream被植入恶意代码

    [安全预警]JavaScript公共库event-stream被植入恶意代码 2018年11月27日,阿里云云盾应急响应中心监测到JavaScript公共库event-stream被植入恶意代码,该恶 ...