劳动是一切知识的源泉。 —— 陶铸

日记列表


  • 天气
  • 2006年09月12日 02:16 星期二

Oracle下的where查询

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

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

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

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

Language:sql, parsed in: 0.001 seconds, using GeSHi 1.0.7.12
  1. SELECT A.a, B.b FROM A,B WHERE A.id = B.id AND rownum < 1000;
  2.  

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

Language:oracle8, parsed in: 0.004 seconds, using GeSHi 1.0.7.12
  1. CREATE OR REPLACE FUNCTION func(p VARCHAR2)
  2.    RETURN VARCHAR2 IS
  3.    ls_val VARCHAR2(200);
  4. BEGIN
  5.    SELECT b FROM B WHERE B.id = p;
  6.    RETURN ls_val;
  7. EXCEPTION
  8.    WHEN OTHERS THEN
  9.       ls_val := NULL;
  10.       RETURN ls_val;
  11. END;
  12.  

然后在sql中写:

Language:sql, parsed in: 0.001 seconds, using GeSHi 1.0.7.12
  1. SELECT A.a, func(A.id) FROM A WHERE rownum < 1000;
  2.  

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

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

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

Tags:Oracle

昵称*:

邮箱 :

主页 :

  • :)
  • :o
  • :D
  • ;)
  • :p
  • :mad:
  • :confused:
  • :(
  • :rolleyes:
  • :cool:
  • :eek: