Non sono chiaro il vero significato nelle definizioni delle funzioni IMMUTABILE, VOLATILE e STABILE.
Ho letto la documentazione, in particolare le definizioni di ciascuno.
IMMUTABLE indica che la funzione non può modificare il database e restituisce sempre lo stesso risultato quando vengono forniti gli stessi valori di argomento ; vale a dire, non effettua ricerche nel database né utilizza in altro modo informazioni non direttamente presenti nel suo elenco di argomenti. Se viene fornita questa opzione, qualsiasi chiamata della funzione con argomenti tutte costanti può essere immediatamente sostituita con il valore della funzione.
STABILE indica che la funzione non può modificare il database e che all'interno di una singola scansione della tabella restituirà costantemente lo stesso risultato per gli stessi valori dell'argomento , ma che il suo risultato potrebbe cambiare tra le istruzioni SQL. Questa è la selezione appropriata per le funzioni i cui risultati dipendono dalle ricerche nel database, dalle variabili dei parametri (come il fuso orario corrente), ecc. (È inappropriato per i trigger AFTER che desiderano interrogare le righe modificate dal comando corrente). Notare inoltre che il La famiglia di funzioni current_timestamp si qualifica come stabile, poiché i loro valori non cambiano all'interno di una transazione.
VOLATILE indica che il valore della funzione può cambiare anche all'interno di una singola scansione della tabella, quindi non è possibile effettuare ottimizzazioni. Relativamente poche funzioni di database sono volatili in questo senso; alcuni esempi sono random (), currval (), timeofday (). Si noti tuttavia che qualsiasi funzione che ha effetti collaterali deve essere classificata volatile, anche se il suo risultato è abbastanza prevedibile, per evitare che le chiamate vengano ottimizzate; un esempio è setval ().
La mia confusione si presenta con la condizione di IMMUTABILE e STABILE che la funzione SEMPRE o CONTINUAMENTE restituisca lo stesso risultato dati gli stessi argomenti.
La definizione IMMUTABLE afferma che la funzione non ricerca nel database o utilizza in altro modo informazioni non direttamente presenti nel suo elenco di argomenti. Quindi, per me, ciò significa che tali funzioni vengono utilizzate per manipolare i dati forniti dal client e non dovrebbero avere istruzioni SELECT ... anche se a me sembra un po 'strano.
Con STABLE, la definizione è simile in quanto afferma che dovrebbe costantemente restituire lo stesso risultato. Quindi, per me, ciò significa che ogni volta che la funzione viene chiamata con gli stessi argomenti, dovrebbe restituire gli stessi risultati (stesse righe esatte, ogni singola volta).
Quindi, per me ... ciò significa che qualsiasi funzione che esegue un SELECT su una o più tabelle che possono essere aggiornate, dovrebbe essere solo volatile.
Ma, di nuovo ... non mi sembra giusto.
Riportando questo nel mio caso d'uso, sto scrivendo funzioni che eseguono istruzioni SELECT con più JOIN su tabelle a cui vengono costantemente aggiunti, quindi ci si aspetta che le chiamate di funzione restituiscano risultati diversi ogni volta che viene chiamata, anche con gli stessi argomenti .
Quindi, ciò significa che le mie funzioni dovrebbero essere VOLATILI? Anche se la documentazione indica che relativamente poche funzioni del database sono volatili in questo senso ?
Grazie!