Apr 04, 2013 14:14
Наткнулся на говно. Имею в постгресе хранимку вида
declare
l_bool boolean;
begin
l_bool := somefunc();
return query select * from
(select * from table where l_bool
union all
select * from table where not l_bool and ...
);
И вот, при замене в запросе переменной l_bool на литерал с реальным значением я получаю 5мс вместо 1600мс.
Это -- не то "кеширование планов", которое хорошо задокументировано в мануле, это что-то другое, так как "кеширование планов" работает при первом вызове функции в пределах сессии, а я вызываю эту функцию с одним и тем же параметром как до, так и после изменения. И это не затраты на парсинг + построение планов, так как последующие запуски показывают примерно то же время.
А план запроса "с переменными" не посмотреть, так как explain хочет на входе полноценный, умеющий выполняться запрос.
В оракле такой хуйни не было!