sql >> Databasteknik >  >> RDS >> PostgreSQL

Varför behandlar PostgreSQL min fråga annorlunda i en funktion?

Uppdatering i PostgreSQL 9.2

Det var en stor förbättring, jag citerar releasekommentarerna här :

Originalt svar för PostgreSQL 9.1 eller äldre

En plpgsql-funktion har en liknande effekt som PREPARE uttalande:frågor analyseras och frågeplanen cachelagras.

Fördelen är att viss overhead sparas för varje samtal.
Nackdelen är att frågeplanen inte är optimerad för de specifika parametervärden som den anropas med.

För frågor på tabeller med jämn datadistribution är detta i allmänhet inga problem och PL/pgSQL-funktioner kommer att fungera något snabbare än råa SQL-frågor eller SQL-funktioner. Men om din fråga kan använda vissa index beroende på de faktiska värdena i WHERE eller, mer allmänt, valde en bättre frågeplan för de specifika värdena, kan du sluta med en suboptimal frågeplan. Prova en SQL-funktion eller använd dynamisk SQL med EXECUTE för att tvinga en fråga att planeras om för varje samtal. Kan se ut så här:

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;

Redigera efter kommentar:

Om denna variant inte ändrar exekveringstiden måste det finnas andra faktorer som spelar in som du kanske har missat eller inte nämnt. En annan databas? Olika parametervärden? Du måste lägga upp mer information.

Jag lägger till ett citat från manualen för att backa upp mina ovanstående uttalanden:




  1. JPA 2.0 Oracle DATE har nulltid

  2. Nyfiken problem med Oracle UNION och ORDER BY

  3. Hur man anropar en lagrad procedur och får returvärde i Slick (med Scala)

  4. Laravel fråga för att få resultat med minst ett element i en array?