sql >> Database >  >> RDS >> PostgreSQL

Waarom behandelt PostgreSQL mijn query anders in een functie?

Bijwerken in PostgreSQL 9.2

Er was een grote verbetering, ik citeer de release-opmerkingen hier :

Oorspronkelijk antwoord voor PostgreSQL 9.1 of ouder

Een plpgsql-functie heeft een soortgelijk effect als de PREPARE statement:query's worden geparseerd en het queryplan wordt in de cache opgeslagen.

Het voordeel is dat er voor elke aanroep wat overhead wordt bespaard.
Het nadeel is dat het queryplan niet is geoptimaliseerd voor de specifieke parameterwaarden waarmee het wordt aangeroepen.

Voor queries op tabellen met een gelijkmatige datadistributie zal dit over het algemeen geen probleem zijn en zullen PL/pgSQL-functies iets sneller werken dan onbewerkte SQL-query's of SQL-functies. Maar als uw zoekopdracht bepaalde indexen kan gebruiken, afhankelijk van de werkelijke waarden in de WHERE clausule of, meer in het algemeen, een beter queryplan voor de specifieke waarden kiest, kunt u eindigen met een suboptimaal queryplan. Probeer een SQL-functie of gebruik dynamische SQL met EXECUTE om te forceren dat de query opnieuw moet worden gepland voor elke oproep. Zou er zo uit kunnen zien:

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;

Bewerken na opmerking:

Als deze variant de uitvoeringstijd niet verandert, moeten er andere factoren in het spel zijn die je misschien hebt gemist of niet hebt vermeld. Andere databank? Verschillende parameterwaarden? Je zou meer details moeten posten.

Ik voeg een citaat toe uit de handleiding om mijn bovenstaande uitspraken te onderbouwen:




  1. Over geclusterde index in postgres

  2. Retourneer de korte dagnaam van een datum in Oracle

  3. SESSIONTIMEZONE Functie in Oracle

  4. Postgres-reeksen zonder een 'eigendom van'-attribuut retourneren geen id in Django 1.3