闲扯Oracle SQL语句解析步骤

数据库 Oracle
这里介绍判断一条Oracle SQL语句的语法是否符合SQL的规范,比如执行:SQL> selet * from emp;我们就可以看出由于Select关键字少了一个“c”,这条语句就无法通过语法检验的步骤了。

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语句所访问的表及列是否准确?用户是否有权限访问或更改相应的表或列?比如如下语句:

  1. SQL> select * from emp;  
  2. select * from emp  
  3. *  
  4. ERROR at line 1:  
  5. ORA-00942: table or view does not exist 

由于查询用户没有可供访问的emp对象,因此该Oracle SQL语句无法通过语义检查。

【编辑推荐】

  1. Oracle SQL语句优化的相关技术分析
  2. Oracle SQL 内置函数大全
  3. ORACLE SQL性能优化 (上)
  4. ORACLE SQL性能优化 (下)
  5. Oracle SQL到DB2 SQL移植解决方案
责任编辑:佚名 来源: 博客园
相关推荐

2010-04-20 15:22:34

Oracle SQL

2009-11-16 11:31:54

Oracle数据导入

2011-08-18 14:25:26

OracleEXPLAIN PLA

2009-11-16 13:47:35

Oracle SQL语

2009-11-16 17:55:58

Oracle SQL语

2017-05-16 11:20:51

SQL语句解析

2009-11-05 18:07:33

Oracle导出sql

2010-04-13 15:04:16

Oracle优化

2010-04-06 15:23:42

Oracle sql

2010-04-13 14:36:17

Oracle性能检测

2009-11-06 17:21:36

验证Oracle SQ

2009-01-14 09:28:12

OracleSQL10g

2010-04-29 14:06:40

Oracle SQL

2010-04-12 14:22:13

Oracle性能sql语句

2017-08-31 14:09:26

数据库MySQLSQL优化

2010-04-29 12:05:21

Oracle使用SQL

2010-04-06 14:26:41

Oracle复制表

2010-04-15 16:36:13

Oracle SQL

2010-04-13 14:43:37

Oracle性能检测

2010-09-25 15:20:43

SQL递归语句
点赞
收藏

51CTO技术栈公众号