sql >> Database >  >> RDS >> PostgreSQL

Hoe beïnvloeden IMMUTABLE, STABLE en VOLATILE trefwoorden het gedrag van de functie?

Het sleutelwoord IMMUTABLE is nooit automatisch toegevoegd door pgAdmin of Postgres. Degene die de functie heeft gemaakt of vervangen, heeft dat gedaan.

De juiste volatiliteit voor de gegeven functie is VOLATILE (ook de standaard), niet STABLE - of het zou geen zin hebben om clock_timestamp() . te gebruiken dat is VOLATILE in tegenstelling tot now() of CURRENT_TIMESTAMP die STABLE . zijn :die retourneren hetzelfde tijdstempel binnen dezelfde transactie. De handleiding:

clock_timestamp() geeft de werkelijke huidige tijd terug, en daarom verandert de waarde ervan zelfs binnen een enkele SQL-opdracht.

De handleiding waarschuwt voor de functie volatiliteit STABLE ...

is ongepast voor AFTER triggers die rijen willen opvragen die zijn gewijzigd door de huidige opdracht.

.. omdat herhaalde evaluatie van de triggerfunctie anders kan opleveren resultaten voor dezelfde rij. Dus niet STABLE .

Je vraagt:

Heb je een idee waarom de functie vijf keer correct is geretourneerd voordat je de vijfde waarde vasthoudt wanneer deze is ingesteld als IMMUTABLE ?

De Postgres-wiki:

Met 9.2 zal de planner specifieke plannen gebruiken met betrekking tot de verzonden parameters (de query wordt gepland bij uitvoering), behalve als de query meerdere keren wordt uitgevoerd en de planner besluit dat het generieke plan niet te veel duurder is dan de specifieke plannen.

Vetgedrukte nadruk van mij. Lijkt niet logisch voor een IMMUTABLE functie zonder invoerparameters. Maar het valse label wordt overschreven door de VOLATILE functie in het lichaam (leegtes function inlining ):een ander zoekplan kan nog steeds zinvol zijn. Gerelateerd:

  • Prestaties van opgeslagen PostgreSQL-procedure

Terzijde

trunc() is iets sneller dan floor() en doet hier hetzelfde, aangezien positieve getallen gegarandeerd zijn:

SELECT (trunc(EXTRACT(EPOCH FROM clock_timestamp()) * 10) - 13885344000)::int



  1. Haal het meeste uit uw PostgreSQL-indexen

  2. Beperkingen tijdelijk uitschakelen (MS SQL)

  3. SQL Server Failover Cluster Installatie -2

  4. Nummerreeks generator uitdaging oplossingen - Deel 3