PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Warum behandelt PostgreSQL meine Abfrage in einer Funktion anders?

Aktualisierung in PostgreSQL 9.2

Es gab eine große Verbesserung, ich zitiere die Versionshinweise hier :

Originalantwort für PostgreSQL 9.1 oder älter

Eine plpgsql-Funktion hat eine ähnliche Wirkung wie PREPARE Anweisung:Abfragen werden analysiert und der Abfrageplan wird zwischengespeichert.

Der Vorteil ist, dass bei jedem Aufruf etwas Overhead eingespart wird.
Der Nachteil ist, dass der Abfrageplan nicht für die jeweiligen Parameterwerte optimiert ist, mit denen er aufgerufen wird.

Bei Abfragen auf Tabellen mit gleichmäßiger Datenverteilung ist dies im Allgemeinen kein Problem, und PL/pgSQL-Funktionen werden etwas schneller ausgeführt als reine SQL-Abfragen oder SQL-Funktionen. Aber ob Ihre Abfrage bestimmte Indizes abhängig von den tatsächlichen Werten in WHERE verwenden kann -Klausel verwenden oder allgemein einen besseren Abfrageplan für die bestimmten Werte auswählen, erhalten Sie möglicherweise einen suboptimalen Abfrageplan. Probieren Sie eine SQL-Funktion aus oder verwenden Sie dynamisches SQL mit EXECUTE um zu erzwingen, dass die Abfrage für jeden Anruf neu geplant wird. Könnte so aussehen:

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;

Nach Kommentar bearbeiten:

Wenn diese Variante die Ausführungszeit nicht ändert, müssen andere Faktoren eine Rolle spielen, die Sie möglicherweise übersehen oder nicht erwähnt haben. Andere Datenbank? Unterschiedliche Parameterwerte? Sie müssten mehr Details posten.

Ich füge ein Zitat aus dem Handbuch hinzu um meine obigen Aussagen zu untermauern: