PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Dlaczego PostgreSQL traktuje moje zapytanie inaczej w funkcji?

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ń:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zarządzanie wysoką dostępnością w PostgreSQL – Część III:Patroni

  2. Jak utworzyć tabelę tylko wtedy, gdy nie istnieje w PostgreSQL

  3. Transponować wiersze i kolumny (tzw. pivot) tylko z minimalną liczbą COUNT()?

  4. Jak sprawdzić wersję PostgreSQL

  5. Dlaczego postgresql 9.1 nie działa z rails 3.0?