劳动是一切知识的源泉。 —— 陶铸
日记列表

- 2006年09月12日 02:16 星期二
Oracle下的where查询
昨天同事和我说起一个有趣的现象:
两张表A,B,通过它们的主键相关查询所消耗的时间比使用建立一个函数,在B上遍历查询所需数据消耗的时间还长。
这么描述也许看不明白,我举个例子:
两表相关查询很简单,sql就是:
Language:sql, parsed in: 0.001 seconds, using GeSHi 1.0.7.12
- SELECT A.a, B.b FROM A,B WHERE A.id = B.id AND rownum < 1000;
而我的函数func也很简单,只是根据入参去表B中查找对应的b而已:
Language:oracle8, parsed in: 0.004 seconds, using GeSHi 1.0.7.12
- 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, parsed in: 0.001 seconds, using GeSHi 1.0.7.12
- SELECT A.a, func(A.id) FROM A WHERE rownum < 1000;
我试过很多表,特别是大数据的(10w以上……太大的表没那么多时间试验
),两个执行的效率还是有一定差距。
我就在想,是不是由于两表相关查询,oracle需要在数据库中先将两张表的数据组合起来再行输出,而使用函数查询,实质上只是单表查询,而函数中的查询也使用了索引,而且由于有条件限制(rownum<1000),所以查询的次数也不太多,所以导致使用函数查询的效率反而更高?
数据库的优化真的是一件很有趣的事情,只是对于我这种还没摸进门的人来说觉得雾里看花,看不明白。






idea's blog
布拉格公园
冷韵的文字空间
Dawn.w/s weblog - Agoodb
Owen's Diary
我们俩