Aktualizacja w PostgreSQL 9.2
Nastąpiła znacząca poprawa, cytuję informacje o wydaniu tutaj :
Oryginalna odpowiedź dla PostgreSQL 9.1 lub starszej
Funkcje plpgsql mają podobny efekt jak PREPARE
instrukcja:zapytania są analizowane, a plan zapytań jest buforowany.
Zaletą jest to, że przy każdym wywołaniu zostaje zaoszczędzony pewien narzut.
Wadą jest to, że plan zapytania nie jest zoptymalizowany pod kątem określonych wartości parametrów, z którymi jest wywoływany.
W przypadku zapytań dotyczących tabel z równomierną dystrybucją danych zazwyczaj nie będzie to stanowić problemu, a funkcje PL/pgSQL będą działać nieco szybciej niż surowe zapytania SQL lub funkcje SQL. Ale jeśli Twoje zapytanie może używać pewnych indeksów w zależności od rzeczywistych wartości w WHERE
lub, bardziej ogólnie, wybierając lepszy plan zapytań dla określonych wartości, możesz otrzymać nieoptymalny plan zapytań. Wypróbuj funkcję SQL lub użyj dynamicznego SQL z EXECUTE
aby wymusić ponowne zaplanowanie zapytania dla każdego połączenia. Może wyglądać tak:
CREATE OR REPLACE FUNCTION pie(id_param integer)
RETURNS SETOF record AS
$BODY$
BEGIN
RETURN QUERY EXECUTE
'SELECT *
FROM table_name
where id = $1'
USING id_param;
END
$BODY$
LANGUAGE plpgsql STABLE;
Edytuj po komentarzu:
Jeśli ten wariant nie zmienia czasu egzekucji, w grę muszą wchodzić inne czynniki, o których mogłeś przeoczyć lub o których nie wspomniałeś. Inna baza danych? Różne wartości parametrów? Musisz opublikować więcej szczegółów.
Dodaję cytat z instrukcji aby wykonać kopię zapasową moich powyższych stwierdzeń: