Oracle中SQL语句运行过程的深度解析

2014-11-24 18:31:39 · 作者: · 浏览: 3

为了延续TOP中从Cursor开始说明,这里的Cursor并非PL/SQL中的Cursor,至于这个Cursor是什么,怎么用中文解释,暂时还不清楚。但是我想他其实是一个概念性的东西,代表了SQL在不同环境中的称谓。顽皮点地说,当一条SQL语句进入了SQL引擎,其就被Cursor了。下面看一张TOP上的Cursor的生命周期:





1:Open Cursor:在本次会话的服务器进程的私有内存UGA(User Global Area)中会开辟一个内存区给这个Cursor。此时,SQL语句还没有和该Cursor相关联。


2:Parse Cursor:这个过程就会让SQL语句和Cursor相关联了。这个步骤就是通常意义的SQL解析,最后将执行计划存入共享区。然后UGA中的Cursor会用一个指针指向共享区的一个可共享的Cursor。


3:Define output variables:定义输出变量主要是对于查询和使用了returning语法的insert,update,和delete语句。


4:Bind input variables:如果SQL使用了绑定变量,则这里需要获取绑定变量的值。


5:Execute cursor:执行,但是SQL语句真正的执行往往会延迟到下个步骤。


6:Fetch cursor:如果sql返回数据,则这里获取返回的数据。


7:Close cursor:关闭cursor,释放UGA中占用的资源。但是共享区中的cursor并不会释放。


在上面这个过程中,对于我们关心的SQL语句的解析,一笔带过。下面继续分析第二个步骤Parse Cursor。对于SQL语句的解析,早就听说是软解析和硬解析,下面我们分析下整个解析的过程: