Оптимизировать одно и то же внутреннее предложение в нескольких операторах выбора - PullRequest
0 голосов
/ 01 мая 2018

разрабатываю процедуру в 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 голосов
/ 01 мая 2018

Я думаю, что Oracle попытается кешировать результаты вашего tbl_keys подзапроса, поэтому, если он возвращает небольшое количество строк, ваши запросы, вероятно, будут в порядке, как они.

Я не знаю, лучше ли , но если у вас проблемы с производительностью, вы можете попробовать альтернативный метод - присоединиться к таблицам, например,

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 очень большая.

Лично я предпочитаю использовать неявные циклы курсора всякий раз, когда это возможно - они просты и могут быть очень быстрыми - но я не знаю, сработает ли это для вашей процедуры, поскольку вы не показали остальную часть этого *. 1015 *

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
...