Oracle下的where查询
昨天同事和我说起一个有趣的现象:
两张表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),所以查询的次数也不太多,所以导致使用函数查询的效率反而更高?
数据库的优化真的是一件很有趣的事情,只是对于我这种还没摸进门的人来说觉得雾里看花,看不明白。

