2014-10-30 6 views
1

My PL/функции SQL делает вставку в таблицу:Используйте намек, только если условие выполняется

procedure MY_PROC(n in number default null) is 
begin 
    insert into MY_TABLE T 
    select ... 
    from ...; 
end; 

Моей проблема: если n равно нуль, запрос идет очень медленно, и я обнаружил, что с помощью materialize подсказка (да, я знаю, что она недокументирована) решает проблему. НО если n не является нулевым, то запрос, который был быстрым, теперь медленный из-за этого намека!

Так есть способ использовать подсказку только в том случае, если выполнено условие? Мне сложно использовать динамический SQL (execute immediate), но я хотел бы избежать этого.

Спасибо!

+0

Как вы знаете, что 'materialize' намек решает проблему? Вы сравнили планы выполнения, чтобы понять, почему? –

+0

Ну, время исполнения - хороший параметр, не так ли? 10s против нескольких минут ... – Emmanuel

+0

Знаете ли вы, как планы будут масштабироваться с реалистичными и изменяющимися объемами данных и входными параметрами? Если вы не знаете, что такое план, вы не знаете, как он будет себя вести в разных условиях. Добавление подсказки только потому, что, казалось, ускорилось в одном экземпляре, не является надежным методом настройки запроса. –

ответ

1

Вы должны написать два заявления вставки, один с намеком и один без него, и разделить их с

if n is null then 
    ... statement with hint 
else 
    ... statement without hint 
end if;