Запрос в процедуре со многими параметрами - PullRequest
0 голосов
/ 26 июня 2018

Существует хранимая процедура, которая возвращает sys_refcursor. Код для этой процедуры: (btw, fk и pk проиндексированы):

procedure GET_SMTH(
  res_cv_out out sys_refcursor,
  <in parameters>)
is
begin
  open res_cv_out for
    select
      t1.<some fields>, t2.<some fields>, <etc.>
    from
      table1 t1
        left outer join
      table2 t2
        on t1.pk = t2.fk
        left outer join
      table3 t3
        on t3.pk = t2.fk
       <etc. many(~10) tables>
    where ( param1 is null
            or
            ( param1 is not null and t2.param1 like '%'||param1||'%' )
           )
      and ( param2 is null
            or
            ( param2 is not null and nvl(t2.param2, t3.param2) like '%'||param2||'%' )
           )
      and ( param3 is null
            or
            ( param3 is not null and t3.param3 like '%'||param3||'%' )
           )
      <etc. many(~15) parameters>;
  end;

В таблице table1 есть около 500kk строк, в остальных, например, около 500k строк (в некоторых около 1k). Около 0,0005% строк таблицы1 обычно удовлетворяют условию.

Если, например, есть индекс для table3.param3 - и только param3 (другие параметры - ноль) будет передано процедуре - будет ли она работать нормально (быстро) (как если бы в разделе where был только param3) или нет?

То есть для описанного выше случая - Oracle во время выполнения изменяет запрос выше на такой (соответственно с изменением плана) или нет? :

select
  t1.<some fields>, t2.<some fields>, <etc.>
from
  table1 t1
    left outer join
  table2 t2
    on t1.pk = t2.fk
    left outer join
  table3 t3
    on t3.pk = t2.fk
   <etc. many(~10) tables>
where  t3.param3 like '%'||param3||'%' 

Как лучше решить такую ​​задачу?

...