sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvorfor behandler PostgreSQL min forespørgsel anderledes i en funktion?

Opdatering i PostgreSQL 9.2

Der var en stor forbedring, jeg citerer udgivelsesbemærkningerne her :

Originalt svar for PostgreSQL 9.1 eller ældre

En plpgsql-funktion har en lignende effekt som PREPARE sætning:forespørgsler parses, og forespørgselsplanen cachelagres.

Fordelen er, at der gemmes noget overhead for hvert opkald.
Ulempen er, at forespørgselsplanen ikke er optimeret til de særlige parameterværdier, den kaldes med.

For forespørgsler på tabeller med jævn datafordeling vil dette generelt ikke være noget problem, og PL/pgSQL-funktioner vil udføre noget hurtigere end rå SQL-forespørgsler eller SQL-funktioner. Men hvis din forespørgsel kan bruge visse indekser afhængigt af de faktiske værdier i WHERE klausul eller mere generelt vælge en bedre forespørgselsplan for de særlige værdier, kan du ende med en suboptimal forespørgselsplan. Prøv en SQL-funktion, eller brug dynamisk SQL med EXECUTE for at tvinge en forespørgsel til at blive omplanlagt for hvert opkald. Kunne se sådan ud:

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;

Rediger efter kommentar:

Hvis denne variant ikke ændrer på eksekveringstiden, må der være andre faktorer på spil, som du måske er gået glip af eller ikke har nævnt. En anden database? Forskellige parameterværdier? Du bliver nødt til at skrive flere detaljer.

Jeg tilføjer et citat fra manualen for at sikkerhedskopiere mine ovenstående udsagn:




  1. Tip til PostgreSQL

  2. Rails ActiveRecord:Sådan bruges bindevariabler med dobbelte anførselstegn på jsonb

  3. Sådan opretter du en offline internationaliseringsapp:Byg projektstrukturen

  4. Deltag i 2 sæt baseret på standardrækkefølge