Функция Postgres намного медленнее при использовании входных переменных
У меня есть функция в Postgres 8.3.5, которая выбирает данные из нескольких таблиц и выводит результат в одну таблицу:
create or replace function test_function_2(startdate timestamp, enddate timestamp)
returns void as $
begin
delete from cl_final_report;
INSERT INTO cl_final_report
SELECT
b.batchkey AS batchnumber,
pv.productkey,
p.name AS productname,
avg(r.value) AS avgchemlean,
sum(r.auxvalue) AS totalweight,
max(o.time) AS timecompleted
FROM result r
LEFT JOIN physicalvalue pv ON r.physicalvaluekey = pv.physicalvaluekey
LEFT JOIN product p ON pv.productkey = p.productkey
LEFT JOIN object o ON r.objectkey = o.objectkey
LEFT JOIN batch b ON o.batchkey = b.batchkey
WHERE pv.name = 'CL'::text AND
and o.time between startdate and enddate
GROUP BY b.batchkey, pv.productkey, p.name
end
$ language plpgsql;
Эта функция занимает 113 секунд для завершения использования PgAdmin и выполнения этой команды:
select test_function_2('05/02/2013', '05/03/2013')
Однако, если я заменю входные переменные в функции на литералы, как это:
create or replace function test_function_2(startdate timestamp, enddate timestamp)
returns void as $
begin
delete from cl_final_report;
INSERT INTO cl_final_report
SELECT
b.batchkey AS batchnumber,
pv.productkey,
p.name AS productname,
avg(r.value) AS avgchemlean,
sum(r.auxvalue) AS totalweight,
max(o.time) AS timecompleted
FROM result r
LEFT JOIN physicalvalue pv ON r.physicalvaluekey = pv.physicalvaluekey
LEFT JOIN product p ON pv.productkey = p.productkey
LEFT JOIN object o ON r.objectkey = o.objectkey
LEFT JOIN batch b ON o.batchkey = b.batchkey
WHERE pv.name = 'CL'::text AND
and o.time between '05/02/2013' and '05/03/2013'
GROUP BY b.batchkey, pv.productkey, p.name
end
$ language plpgsql;
Функция выполняется менее чем за 5 секунд.
Я новичок в Postgres, поэтому, возможно, что-то мне не хватает, но я не могу найти ответ где-нибудь