Oracle还是比较常用的,于是我研究了一下Oracle SQL语句,在这里拿出来和大家分享一下,希望对大家有用。我们都知道在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、 语法检测。判断一条Oracle 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对象,因此该Oracle SQL语句无法通过语义检查。
【编辑推荐】