详聊验证Oracle SQL语句

数据库 Oracle
这里介绍验证Oracle SQL语句是否完全一致。在这个步骤中,Oracle将会对传递进来的SQL语句使用HASH函数运算得出HASH值,再与共享池中现有语句的 HASH值进行比较看是否一一对应。

学习Oracle时,你可能会遇到验证Oracle SQL语句问题,这里将介绍验证Oracle SQL语句问题的解决方法,在这里拿出来和大家分享一下。检查共享池中是否有相同的语句存在。假如执行的SQL语句已经在共享池中存在同样的副本,那么该SQL语句将会被软解析,也就是可以重用已解析过的语句的执行计划和优化方案,可以忽略语句解析过程中最耗费资源的步骤,这也是我们为什么一直强调避免硬解析的原因。这个步骤又可以分为两个步骤:

(1)验证Oracle 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,情况会是如何呢?

我们可以看到这四个查询的语句文本和HASH值都是一样的,但是由于查询的对象不同,只有后面两个语句是可以共享的,不同情况的语句还是需要硬解析的。因此在检查共享池共同SQL语句的时候,是需要根据具体情况而定的。

(2)验证Oracle SQL语句执行环境是否相同。比如同样一条SQL语句,一个查询会话加了/*+ first_rows */的HINT,另外一个用户加/*+ all_rows */的HINT,他们就会产生不同的执行计划,尽管他们是查询同样的数据。我们下面就一个实例来说明SQL执行环境对解析的影响,我们通过将会话的 workarea_size_policy变更来查看对同样一条SQL语句执行的影响。

Oracle根据提交的SQL语句再查询相应的数据对象是否有统计信息。如果有统计信息的话,那么CBO将会使用这些统计信息产生所有可能的执行计划(可能多达成千上万个)和相应的Cost,最终选择Cost最低的那个执行计划。如果查询的数据对象无统计信息,则按RBO的默认规则选择相应的执行计划。这个步骤也是解析中最耗费资源的,因此我们应该极力避免硬解析的产生。至此,解析的步骤已经全部完成,Oracle将会根据解析产生的执行计划执行SQL语句和提取相应的数据。

【编辑推荐】

  1. 三分钟搞定oracle用户表空间
  2. Oracle导出sql语句存储过程
  3. 详聊Oracle用户表空间宝典
  4. 浅析Oracle用户表空间权限的几个问题
  5. 闲扯Oracle SQL语句解析步骤
责任编辑:佚名 来源: 博客园
相关推荐

2009-11-05 17:53:05

Oracle用户表空间

2010-03-22 13:51:12

云计算

2009-11-16 13:47:35

Oracle SQL语

2009-11-16 17:55:58

Oracle SQL语

2009-11-05 18:07:33

Oracle导出sql

2010-04-13 15:04:16

Oracle优化

2009-11-06 17:13:24

Oracle SQL语

2010-04-13 14:36:17

Oracle性能检测

2011-03-23 14:54:34

2011-05-19 11:00:44

2010-04-20 15:22:34

Oracle SQL

2009-01-14 09:28:12

OracleSQL10g

2010-04-12 14:22:13

Oracle性能sql语句

2010-04-29 14:06:40

Oracle SQL

2010-04-29 12:05:21

Oracle使用SQL

2010-04-06 14:26:41

Oracle复制表

2022-10-09 08:35:06

SQL自定义排序

2010-04-13 14:43:37

Oracle性能检测

2010-09-25 15:20:43

SQL递归语句

2009-11-18 17:05:47

捕获Oracle SQ
点赞
收藏

51CTO技术栈公众号