指穷于为薪,火传也,不知其尽也。—《养生主》

Daily English:He is a wise man who speaks little.

Oracle下的where查询

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

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

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

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

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

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

Language:  Oracle 8 SQL
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中写:

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

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

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

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

分享家:Addthis中国

Leave a comment for: "Oracle下的where查询"

*

Tag Cloud