Postgresql вопрос оптимизации - PullRequest
1 голос
/ 23 сентября 2010

Мне интересно, есть ли какая-то разница между добавлением LIMIT и OFFSET в теле функции plpgsql и вызовом функции.

CREATE FUNCTION test ()
RETURNS record AS
$body$
DECLARE
BEGIN
    select * from producent order by id limit 5 offset 10;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER;

CREATE FUNCTION test1 ()
RETURNS record AS
$body$
DECLARE
BEGIN
    select * from producent order by id;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER;

Что будет быстрее:

select * from test();

или

select * from test1() limit 5 offset 10;

Ответы [ 2 ]

2 голосов
/ 23 сентября 2010

Я второй ответ iddqd, и дополнительно я бы указал, что есть только один способ применить LIMIT и OFFSET к функции черного ящика; но может быть несколько способов применить их в запросе - по крайней мере, в принципе. LIMIT определенно учитывается оптимизатором (он часто может избежать генерации большего количества строк, чем будет возвращено). Я полагаю, что OFFSET совсем не оптимизирован и даже служит «барьером оптимизации» в более сложных случаях; если у вас есть подзапрос с предложением OFFSET, он будет спланирован отдельно от основного запроса, а не свернут в него.

В конечном счете, конечно же, в первую очередь вам следует позаботиться о удобочитаемости и удобстве использования: лучше ли скрывать ограничение / смещение внутри функции или вне ее в любом месте, где используется функция?

0 голосов
/ 23 сентября 2010

Для больших таблиц быстрее будет выбрано сто тысяч строк * из test (); Пейджинг внутри функции тела устраняет много строк. Чем меньше строк, тем лучше.

...