在oracle查询中改写用户定义函数的使用

时间:2014-07-03 02:55:00

标签: sql oracle oracle11g oracle10g

我有一个用户定义的oracle函数,它按以下方式使用。

 select
        table1.id,
        table2.id,
        ..
 from
        table1, table2
 where
        func(table1.id) = table2.id;

我们可以忽略两个表的其他字段。

现在,func(x)基本上在table1中查询与给定参数对应的不同字段(id1)。

func(x)可以定义为

   select 
          id1
   from
          table1
   where
          table1.flag = 'Y'
          and id = x;

   if id1 is null, func(x) returns x else it returns id1.

鉴于已知该查询被调用数百万次,我如何重新编写该函数以提高执行的操作的效率?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,没有该功能的逻辑将是:

 select table1.id, table2.id, ...
 from table1, table2
 where table1.id = table2.id and table1.flag = 'y' and table1.id1 is null or
       table1.id1 = table2.id and table1.flag = 'y'

最好将其作为unionunion all

实施
 select table1.id, table2.id, ...
 from table1 join
      table2
      on table1.id = table2.id and table1.flag = 'y' and table1.id1 is null
 union
 select table1.id, table2.id, ...
 from table1 join
      table2
      on table1.id1 = table2.id and table1.flag = 'y';

where子句中的函数调用不会很好地优化。即使是or语句也常常会阻碍优化。 union可以导致更好的子查询,这可以弥补删除不同值的增加的计算。