解剖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)。

猜你喜欢

转载自ysj5125094.iteye.com/blog/1748686