ORACLE数据库SQL语句的执行过程(1)
时间:2013-11-02 15:32 作者:Superthink 点击:次
SQL语句在数据库中处理过程是怎样的呢?执行顺序呢?在回答这个问题前,我们先来回顾一下:在ORACLE数据库系统架构下,SQL语句由用户进程产生,然后传到相对应的服务端进程,之后由服务器进程执行该SQL语句,如果是SELECT语句,服务器进程还需要将执行结果回传给用户进程。
SQL语句的执行过程一般如下:
解析(PARSE)—— 绑定(BIND)——执行(EXECUTE)——提取(FETCH 只有SELECT才需要这步)

解析
服务器进程接收到一个SQL语句时,首先要将其转换成执行这个SQL语句的最有效步骤,这些步骤被称为执行计划。
Step 1:检查共享池中是否有之前解析相同的SQL语句后所存储的SQL文本、解析树和执行计划。如果能从共享池的缓存库中找到之前解析过生成的执行计划,则SQL语句则不需要再次解析,便可以直接由库缓存得到之前所产生的执行计划,从而直接跳到绑定或执行阶段,这种解析称作软解析。
但是如果在共享池的库缓存中找不到对应的执行计划,则必须继续解析SQL、生成执行计划,这种解析称作硬解析
在缓存池解析过的SQL,会有一个对应的哈希值与之对应,你可以通过V$SQL视图来查询,请看下面一个例子:
SQL>SELECT * FROM SCOTT.DEPT WHERE DEPTNO =10;
SQL>SELECT * FROM SCOTT.DEPT WHERE DEPTNO =20;
SQL> SELECT HASH_VALUE , ADDRESS, EXECUTIONS ,SQL_TEXT
2 FROM V$SQL
3 WHERE SQL_TEXT LIKE 'SELECT * FROM SCOTT.DEPT WHERE DEPTNO%'
4 ;
HASH_VALUE ADDRESS EXECUTIONS SQL_TEXT
---------- -------- ---------- --------------------------------------------------------------------------------
442836625 27EE4B7C 1 SELECT * FROM SCOTT.DEPT WHERE DEPTNO =20
4215405494 27EEA3BC 1 SELECT * FROM SCOTT.DEPT WHERE DEPTNO =10
下面我们先清空共享池缓存的执行计划,然后使用绑定变量,查看执行计划的变换
SQL> ALTER SYSTEM FLUSH SHARED_POOL;
System altered
SQL> VARIABLE deptno NUMBER;
SQL> EXECUTE :deptno := 10;
PL/SQL procedure successfully completed
deptno
---------
10
SQL> SELECT * FROM SCOTT.DEPT WHERE DEPTNO=:deptno;
DEPTNO DNAME LOC
------ -------------- -------------
10 ACCOUNTING NEW YORK
SQL> EXECUTE :deptno :=20;
PL/SQL procedure successfully completed
deptno
---------
20
SQL> SELECT * FROM SCOTT.DEPT WHERE DEPTNO=:deptno;
(责任编辑:Superthink)
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-