`

解剖SQL语句执行过程

阅读更多

 

文章截取自《品悟性能优化》。

 

 

以例子来说明。

 

一个屡见不鲜的错误:

      假设在一个联机交易系统中,客户并发访问量很大,都要查询不同的员工信息,于是这样写程序:

select * from emp where empno = 1234 ;
...
select * from emp where empno = 4567 ;
...
select * from emp where empno = 7890 ;

     假设已经按empno字段建了索引,还有什么问题吗?答案:单个语句没有任何问题,合在一起就有问题了。 

     上述语句应该修改成这样:

select * from emp where empno = :x ;

     其中x是个变量,在真正的执行过程中,分别为x赋值1234,4567,7890等,查询出需要的结果。 

 

 

解剖SQL语句的执行过程:

     为理解上面的常见错误原因所在,特别是在理论上理解语句共享性原理,需要从解剖SQL语句执行过程开始。

下图是SQL语句的主要执行过程:

 

 

即SQL语句主要分为如下4个阶段。

1.Parse(解析)阶段
      在该阶段,Oracle将首先在Share Pool中搜索该语句,即判断该语句是否已经被分析和执行过,如果没有发现该语句,则需要检查该语句的语法、检查该语句的主义及访问权限、对视力定义和子查询进行转换操作,并最终确定该语句优化的执行计划,这个完整的分析过程叫硬解析(Hard Parse)。如果在Share Pool中发现了该语句,说明该语句已经被分析和执行过,则只需要检查该语句的语义及访问权限,而其他大部分工作则无需再进行了。这个过程叫软解析(Soft Parse)。可见硬解析比软解析的资源消耗大多了。
2.Bind(绑定)阶段
      在该阶段,当SQL语句含有变量(Bind变量)时,Oracle通过赋值或传参等方式为这些Bind变量赋值。
3.Execute(执行)阶段
      在该阶段,Oracle将实施Parse阶段确定的执行计划,开始执行DML语句,实现I/O及排序操作等。如果是DDL、DML操作,完成此阶段,则执行过程结束。
4.Fetch(获取)阶段
      在该阶段只适合于Select操作,即进行查询记录的读取并对查询结果进行排序。为提高性能,Oracle建议以数组方式成批提取记录,降低服务器和客户端的网络传输次数(Round-trip)。

 

 

 

 

 

  • 大小: 20.8 KB
1
2
分享到:
评论

相关推荐

    Oracle 高性能SQL引擎剖析:SQL优化与调优机制详解 (黄玮) 高清PDF扫描版

    重点讲解执行计划在sql语句执行的生命周期中所处的位置和作用,sql引擎如何生成执行计划以及如何获取sql语句的执行计划,如何从各种数据源显示和查看已经生成的执行计划。 第二篇“sql优化技术”深入分析oracle的...

    Oracle 高性能SQL引擎剖析:SQL优化与调优机制详解

    重点讲解执行计划在SQL语句执行的生命周期中所处的位置和作用,SQL引擎如何生成执行计划以及如何获取SQL语句的执行计划,如何从各种数据源显示和查看已经生成的执行计划。 第二篇“SQL优化技术”深入分析Oracle的SQL...

    Oracle高性能SQL引擎剖析

    重点讲解执行计划在SQL语句执行的生命周期中所处的位置和作用,SQL引擎如何生成执行计划以及如何获取SQL语句的执行计划,如何从各种数据源显示和查看已经生成的执行计划。, 第二篇“SQL优化技术”深入分析Oracle的...

    Oracle 高性能SQL引擎剖析SQL优化与调优机制详解

    资深Oracle DBA黄玮(Fuyuncat)十年磨一剑 深入揭示OracleSQL优化与调优的原理、核心...然后介绍如何对SQL语句进行优化以获得稳定、高效的性能。最后,依据对SQL优化及调优技术的分析,介绍如何快速优化SQL的思路。

    信息系统与数据库技术教学大纲.docx

    SQL语言概述 数据库定义语言DDL简介 数据操纵语言DML的查询语句SELECT——单表查询 第三周 讲义(SQL概述、DDL、SELECT单表查询) 第三周 实验 DDL脚本生成与Select语句单表查询 单元测验:DDL语句及Select语句单表...

    亮剑.NET深入体验与实战精要2

    15.5.10 反复地执行SQL语句用 Prepare() 569 15.5.11 分页的数据访问 570 15.5.12 SQL命令的优化 570 15.5.13 tempdb的使用技巧 572 15.5.14 使用视图代替跨库操作 572 15.5.15 尽量避免大事务操作 572 15.5.16...

    亮剑.NET深入体验与实战精要3

    15.5.10 反复地执行SQL语句用 Prepare() 569 15.5.11 分页的数据访问 570 15.5.12 SQL命令的优化 570 15.5.13 tempdb的使用技巧 572 15.5.14 使用视图代替跨库操作 572 15.5.15 尽量避免大事务操作 572 15.5.16...

    magento开发教程

    1.Magento的配置系统 4 1.1设置组件的目录结构 4 1.2创建模块逻辑 6 1.3配置文件分析 7 1.4配置文件的作用 8 ...9.5比较运算符,构造Sql语句 86 9.6总结 89 10.技能考核 89 10.1理论考核 89 10.2实战考核 89

    vc++ 开发实例源码包

    这个例子就是查询任何可执行文件的版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! 如题。详细见源码。 GMem 内存管理单元源码。GMem.cpp...

    vc++ 应用源码包_1

    这个例子就是查询任何可执行文件的版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! GMem 内存管理单元源码。GMem.cpp和GMem.h是内存管理...

    vc++ 应用源码包_2

    这个例子就是查询任何可执行文件的版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! GMem 内存管理单元源码。GMem.cpp和GMem.h是内存管理...

    vc++ 应用源码包_6

    这个例子就是查询任何可执行文件的版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! GMem 内存管理单元源码。GMem.cpp和GMem.h是内存管理...

    vc++ 应用源码包_5

    这个例子就是查询任何可执行文件的版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! GMem 内存管理单元源码。GMem.cpp和GMem.h是内存管理...

    vc++ 应用源码包_3

    这个例子就是查询任何可执行文件的版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! GMem 内存管理单元源码。GMem.cpp和GMem.h是内存管理...

Global site tag (gtag.js) - Google Analytics