在多个select语句中优化相同的内部子句

时间:2018-05-01 12:01:01

标签: oracle select optimization clause

我在Oracle中开发程序 我需要写这样的东西:

--
open curr1 for
select *
from table1 
where key_field in (select key_field from tbl_keys where type = 1);
--
open curr2 for
select *
from table2 
where key_field in (select key_field from tbl_keys where type = 1);
--
open curr3 for
select *
from table3 
where key_field in (select key_field from tbl_keys where type = 1);
--

有更好的方法吗? 内部选择的任何优化? 谢谢!

1 个答案:

答案 0 :(得分:0)

我认为Oracle会尝试缓存您的tbl_keys子查询的结果,因此如果它返回少量行,那么您的查询可能会很好。

我不知道它是否更好,但如果您遇到性能问题,可以尝试使用 alternate 方法加入表格,例如

open curr1 for
select t.*
from table1 t
join tbl_keys k 
  on k.key_field = t.key_field 
    and k.type = 1;

如果你的tbl_keys表非常大,这个可能会提高性能。

就个人而言,我更喜欢尽可能使用隐式游标循环 - 它们很简单且速度非常快 - 但我不知道它是否适用于您的程序,因为您没有显示其余部分。< / p>

for r in (select t.*
    from table1 t
    join tbl_keys k 
      on k.key_field = t.key_field 
        and k.type = 1)
loop
  -- output the row somehow
end loop;

for r in (select t.*
    from table2 t
    join tbl_keys k 
      on k.key_field = t.key_field 
        and k.type = 1)
loop
  -- output the row somehow
end loop;

...etc