首页 > 数据库 > Oracle > Oracle中SQL语句解析的步骤
我们都知道在Oracle中每条SQL语句在执行之前都需要经过解析,这里面又分为软解析和硬解析。那么这两种解析有何不同之处呢?它们又分别是如何进行解析呢?Oracle内部解析的步骤又是如何进行的呢?下面我们就这些话题进行共同探讨。
[@more@]在Oracle中存在两种类型的SQL语句,一类为DDL语句,他们是从来不会共享使用的,也就是每次执行都需要进行硬解析。还有一类就是DML语句,他们会根据情况选择要么进行硬解析,要么进行软解析。在Oracle 8i OCP教材的023中1-12有说明SQL语句的解析步骤,当一条SQL语句从客户端进程传递到服务器端进程后,需要执行如下步骤:代码:
SQL> connect a/a
Connected. SQL> create table emp ( x int );
Table created.
SQL> select * from emp;
no rows selected
SQL> connect b/b
Connected. SQL> create table emp ( x int );
Table created.
SQL> select * from emp;
no rows selected
SQL> conn scott/tiger
Connected. SQL> select * from emp; SQL> conn c/c
Connected. SQL> select * from emp; SQL> conn/as sysdba
Connected. SQL> select address,hash_value, executions, sql_text
2 from v$sql
3 where upper(sql_text) like 'SELECT * FROM EMP%'
4 /
ADDRESS HASH_VALUE EXECUTIONS SQL_TEXT -------- ---------- ---------- ------------------------ 78B89E9C 3011704998 1 select * from emp
78B89E9C 3011704998 1 select * from emp
78B89E9C 3011704998 2 select * from emp ...
代码:
SQL> select kglhdpar, address,
2 auth_check_mismatch, translation_mismatch
3 from v$sql_shared_cursor
4 where kglhdpar in
5 ( select address
6 from v$sql
7 where upper(sql_text) like 'SELECT * FROM EMP%' )
8 /
KGLHDPAR ADDRESS A T -------- -------- - - 78B89E9C 786C9D78 N N
78B89E9C 786AC810 Y Y
78B89E9C 786A11A4 Y Y ...
代码:
SQL> alter system flush shared_pool;
System altered.
SQL> show parameter workarea_size_policy
NAME TYPE VALUE ------------------------------------ ----------- -------------- workarea_size_policy string AUTO
SQL> select count(*) from t;
COUNT(*)
----------
5736
SQL> alter session set workarea_size_policy=manual;
Session altered.
SQL> select count(*) from t;
COUNT(*)
----------
5736
SQL> select sql_text, child_number, hash_value, address
2 from v$sql
3 where upper(sql_text) = 'SELECT COUNT(*) FROM T'
4 /
SQL_TEXT CHILD_NUMBER HASH_VALUE ADDRESS ------------------------------ ------------ ---------- -------- select count(*) from t 0 2199322426 78717328
select count(*) from t 1 2199322426 78717328
...
代码:
SQL> select optimizer_mismatch
2 from v$sql_shared_cursor
3 where kglhdpar in
4 ( select address
5 from v$sql
6 where upper(sql_text) = 'SELECT COUNT(*) FROM T' );
O - N
Y
...
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/60857/viewspace-810240/ ,如需转载,请注明出处,否则将追究法律责任。