Le funzioni di Postgres sono dichiarate con classificazione di volatilità VOLATILE, STABLEoIMMUTABLE . Il progetto è noto per essere molto severo con queste etichette per le funzioni integrate. E con una buona ragione. Esempio di spicco: gli indici di espressione consentono solo IMMUTABLEfunzioni e queste devono essere veramente immutabili per evitare risultati errati.
Le funzioni definite dall'utente sono ancora libere di essere dichiarate quando il proprietario sceglie. Il manuale consiglia:
Per i migliori risultati di ottimizzazione, è necessario etichettare le funzioni con la categoria di volatilità più rigorosa valida per esse.
... e aggiunge un ampio elenco di cose che possono andare storte con un'etichetta di volatilità errata.
Tuttavia, ci sono casi in cui falsificare l'immutabilità ha senso. Soprattutto quando sai che la funzione è, infatti, immutabile nel tuo ambito. Esempio:
Tutte le possibili implicazioni sull'integrità dei dati a parte , qual è l'effetto sulle prestazioni? Si potrebbe supporre che la dichiarazione di una funzione IMMUTABLEpossa essere vantaggiosa solo per le prestazioni . È così?
La dichiarazione di volatilità delle funzioni può IMMUTABLE danneggiare le prestazioni?
Supponiamo che l'attuale Postgres 10 lo restringa, ma tutte le versioni recenti sono interessanti.
FORCEche gli indici di espressione debbano accettare funzioni non immutabili (contrassegnandoli come potenziale punto di errore). Sì, sembrerebbe una soluzione più elegante dei wrapper di funzioni immutabili.
FORCEentrambi i modi. Il 100% dei DBA PostgreSQL con esperienza mentono per aggirare quell'interfaccia utente con funzioni wrapper. Almeno conFORCE, non avremmo bisogno di involucri e non dovremmo mentire sulla volatilità dichiarata.