Я (должен) использовать базу данных Postgres 8.4. В этой базе данных я создать функцию:Функция Postgres медленнее, чем запрос/Postgres 8.4
CREATE OR REPLACE FUNCTION counter (mindate timestamptz,maxdate timestamptz) RETURNS integer AS $func$
DECLARE result integer;
BEGIN
Select INTO result COUNT(*) AS counter from columname where starttime BETWEEN $1 and $2;
Return result;
END
$func$ LANGUAGE plpgsql;
запрос:
apptelemetry=# select counter('2016-03-01 00:00:00','2016-03-11 00:00:00');
requestcounter
----------------
8893
(1 row)
Time: 4.740 ms
Когда я сделать нормальный запрос:
apptelemetry=# select Count(*) from columname where starttime BETWEEN '2016-03-01 00:00:00' AND '2016-03-11 00:00:00';
count
-------
8893
(1 row)
Time: 3.214 ms
Почему функция медленнее, чем обычный запрос? Есть ли у меня рекомендации по производительности?
Regrads
это произойдет, если запустить тот же запрос несколько раз? и у вас есть индекс для 'starttime', потому что это не должно быть так медленно, независимо от порядка. –
Для этого вам не нужен 'PL/pgSQL'. Накладные расходы на 1 мс вполне могут быть вызваны накладными расходами на вызов PL/pgSQL. Что произойдет, если вы измените это на простую функцию 'language sql'? –
«Почему функция медленнее обычного запроса?» --- Почему функция должна быть быстрее? Просто потому, что вы что-то вложили в функцию, это не ускоряет работу автоматически. – zerkms