<b>Oracle中SQL语句解析的步骤-入门底子</b>[Oracle防范]
本文“<b>Oracle中SQL语句解析的步骤-入门底子</b>[Oracle防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
我们都知道在Oracle中每条SQL语句在履行之前都需求经过解析,这里面又分为软解析和硬解析.那么这两种解析有何差别之处呢?它们又辨别是若何举行解析呢?Oracle内部解析的步骤又是若何举行的呢?下面我们就这些话题举行共同探究.
在Oracle中存在两种范例的SQL语句,一类为DDL语句,他们是历来不会同享利用的,也就是每次履行都需求举行硬解析.还有一类就是DML语句,他们会按照情形挑选要末举行硬解析,要末举行软解析.在Oracle 8i OCP教材的023中1-12有阐明SQL语句的解析步骤,当一条SQL语句从客户端进程传送到服务器端进程后,需求履行以下步骤:
• 在同享池中搜索 SQL 语句的现有副本
• 考证 SQL 语句的语法能否精确
• 履行数据字典查找来考证表和列的定义
• 获得对象的解析锁以便在语句的解析历程中对象的定义不会改变
• 查抄用户拜候引用筹划对象的权限
• 肯定语句的最佳履行筹划
• 将语句和履行筹划载入同享的 SQL 区
这个先入为主的概念一向占据着我的脑海,我认为硬解析就是上面几个步骤.相关于硬解析,软解析的步骤就是上面第一步找到现有SQL语句的副本后,只需求考证用户能否有权限履行就是了,这样省略上面好几个步骤,相对硬解析来说性能开销就非常小了.即便是在论坛上和大家谈论时,我也一向保持这个见解.直到前一天看了Tom的《Effective Oracle By Design》中关于语句处理的章节后,我才知道这个自己一向保持的概念事实上是错误的.
事实上,在Oracle中SQL语句的解析步骤以下:
1、 语法检测.判断一条SQL语句的语法能否符合SQL的标准,比方履行:SQL> selet * from emp;我们便可以看出由于Select关键字少了一个"c",这条语句就无法通过语法查验的步骤了.
2、 语义查抄.语法精确的SQL语句在解析的第二个步骤就是判断该SQL语句所拜候的表及列能否精确?用户能否有权限拜候或更改呼应的表或列?比方以下语句:
SQL> select * from emp; select * from emp * ERROR at line 1: ORA-00942: table or view does not exist |
由于查询用户没有可供拜候的emp对象,因此该SQL语句无法通过语义查抄.
3、 查抄同享池中能否有相同的语句存在.假定履行的SQL语句已经在同享池中存在一样的副本,那么该SQL语句将会被软解析,也就是可以重用已解析过的语句的履行筹划和优化筹划,可以忽视语句解析历程中最耗费资源的步骤,这也是我们为什么一向夸大避免硬解析的缘由.这个步骤又可以分为两个步骤:
(1)考证SQL语句能否完好一致.在这个步骤中,Oracle将会对传送进来的SQL语句利用HASH函数运算得出HASH值,再与同享池中现有语句的HASH值举行对比看能否一一对应.现有数据库中SQL语句的HASH值我们可以通过拜候v$sql、v$sqlarea、v$sqltext等数据字典中的HASH_VALUE列查询得出.假如SQL语句的HASH值一致,那么ORACLE事实上还需求对SQL语句的语义举行再次检测,以决意能否一致.那么为什么Oracle需求再次对语句文本举行检测呢?不是SQL语句的HASH值已经对应上了?事实上就算是SQL语句的HASH值已经对应上了,并不能阐明这两条SQL语句就已经可以同享了.我们首先参考以下一个例子:假定用户A有自己的一张表EMP,他要履行查询语句:select * from emp;用户B也有一张EMP表,一样要查询select * from emp;这样他们两条语句在文本上是一模一样的,他们的HASH值也会一样,但是由于触及到查询的相关表不一样,他们事实上是无法同享的.假定这时刻用户C又要查询一样一条语句,他查询的表为scott下的公有同义词,还有就是SCOTT也查询一样一张自己的表emp,情形会是若何呢?
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 |
我们可以看到这四个查询的语句文本和HASH值都是一样的,但是由于查询的对象差别,只有背面两个语句是可以同享的,差别情形的语句还是需求硬解析的.因此在查抄同享池共同SQL语句的时刻,是需求按照具体情形而定的.
以上是“<b>Oracle中SQL语句解析的步骤-入门底子</b>[Oracle防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |