Существует хранимая процедура, которая возвращает 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||'%'
Как лучше решить такую задачу?