CharlieShen

新人,大家多关照啦@_@

  博客中心 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 登录 ::
  3994 随笔 :: 0 文章 :: 20 评论 :: 0 Trackbacks
Cached @ 2025/4/28 21:19:31Control ASP.skins_cogitation_controls_blogstats_ascx
<2007年9月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

留言簿(14)

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜

Cached @ 2025/4/28 21:19:31Control ASP.skins_cogitation_controls_singlecolumn_ascx

四问:连接次序与谓词求值

在下面的查询中,WHERE 语句的哪一部分先执行?

Select field names from emp, dept
  where emp.dept_num = dept.num and
  emp.name Like 'S%' and dept.name='IT';

答:执行次序随已有的索引、统计、和session/init.ora参数的不同而变化。

假定已有一个建立在DEPT(name)和EMP(dept_num)上的索引。假定优化器认为DEPT是唯一的,它可能按下面的顺序进行操作:

利用建立在DEPT(name)上的索引查找dept列

利用建立在EMP(dept_num)上的索引查找匹配的emp列(即连接emp.dept_num = dept.num)

依据建立在emp.ename like 'S%'进行过滤

现在,我们假定没有建立在EMP(dept_num)上的索引,也没有建立在DEPT(name)上的索引,而存在建立在EMP(name)和DEPT(num)上的索引。优化器可能按下面的次序进行操作:

利用建立在EMP(name)上的索引找到带有S的EMPS

利用建立在DEPT(num)上的索引找到匹配项

根据dept.name = 'IT'过滤结果

谓词求值的次序是不确定的,可以随时间的改变而改变,并由优化器决定。不要假定任何事情会按一定的次序发生。如果你那么做,随着时间的推移,你的应用程序可能会出现一些看起来非常奇怪的错误。看以下的例子:建立一个表,输入一些数据。当X='a’时,第二列的数据“Y”是一个数值,当X='b’时,“Y”不是数字。

SQL> create table t ( x varchar2(1), y varchar2(1) );
  Table created.
  SQL> insert into t values ( 'a', '1' );
  1 row created.
  SQL> insert into t values ( 'b', 'x' );
  1 row created.

现在根据这个表运行一个查询:查找满足x='a',y=1的行。

SQL> select * from t where x = 'a' and
  y = 1;
  ERROR:
  ORA-01722: invalid number
  no rows selected(错误,无效的数字,没有选择任何行)

呦,没有成功。在这种情况下,数据库首先执行Y=1,当找到Y='X'的行后,很显然,它不能将'X'转换为一个数字,所以失败了。而下面的程序将给出不同的结果:

SQL> analyze table t compute statistics;
  Table analyzed.(表已经分析过)
  SQL> select * from t where x = 'a' and
  y = 1;
  X Y
  - -
  a 1

使用不同的优化器模式,成功了!为什么?优化器说:“嘿,检查x= 'a'要比检查y=1来得快,因为在y=1中有一个将y从字符变为数字的转换。所以,我先检查x= 'a',然后再检查y=1。”

这个例子说明谓词执行的次序可能是不确定的,你不能指望有一种特定的执行次序。也就是说,当你依靠一个隐含的转换时,必须非常谨慎。

分享按钮发布于: 2007-09-23 10:39 CharlieShen 阅读(115) 评论(0)  编辑 收藏