我有一个用户定义的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.
鉴于已知该查询被调用数百万次,我如何重新编写该函数以提高执行的操作的效率?
答案 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'
最好将其作为union
或union 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
可以导致更好的子查询,这可以弥补删除不同值的增加的计算。