Oracle下的where查询

This entry was posted by 子乌 on 星期二, 12 九月, 2006 at  Views:436

昨天同事和我说起一个有趣的现象:

两张表A,B,通过它们的主键相关查询所消耗的时间比使用建立一个函数,在B上遍历查询所需数据消耗的时间还长。

这么描述也许看不明白,我举个例子:

两表相关查询很简单,sql就是:

SELECT A.a, B.b FROM A,B WHERE A.id = B.id AND rownum < 1000;

而我的函数func也很简单,只是根据入参去表B中查找对应的b而已:

CREATE OR REPLACE FUNCTION func(p VARCHAR2)
   RETURN VARCHAR2 IS
   ls_val VARCHAR2(200);
BEGIN
   SELECT b FROM B WHERE B.id = p;
   RETURN ls_val;
EXCEPTION
   WHEN OTHERS THEN
      ls_val := NULL;
      RETURN ls_val;
END;

然后在sql中写:

SELECT A.a, func(A.id) FROM A WHERE rownum < 1000;

我试过很多表,特别是大数据的(10w以上……太大的表没那么多时间试验),两个执行的效率还是有一定差距。

我就在想,是不是由于两表相关查询,oracle需要在数据库中先将两张表的数据组合起来再行输出,而使用函数查询,实质上只是单表查询,而函数中的查询也使用了索引,而且由于有条件限制(rownum<1000),所以查询的次数也不太多,所以导致使用函数查询的效率反而更高?

数据库的优化真的是一件很有趣的事情,只是对于我这种还没摸进门的人来说觉得雾里看花,看不明白。

你可能对这些也感兴趣


Leave a Reply