In Spanner, le funzioni, incluse quelle SQL integrate e quelle definite dall'utente, sono classificate in base alla loro volatilità. La categoria di volatilità indica se una funzione restituisce lo stesso risultato quando viene chiamata con gli stessi argomenti. Questa classificazione influisce sul modo in cui l'ottimizzatore di query gestisce la funzione e su dove puoi utilizzarla, ad esempio nelle espressioni delle colonne generate o nelle definizioni degli indici. Comprendere la volatilità delle funzioni ti aiuta a scrivere query e schemi più prevedibili e performanti in Spanner.
Esistono tre categorie di volatilità, simili ai concetti dei sistemi come PostgreSQL:
Immutabile: una funzione è immutabile se restituisce gli stessi risultati quando la chiami con gli stessi valori degli argomenti. Questo comportamento significa che il risultato della funzione dipende solo dai relativi argomenti di input e non dallo stato del database, dalle impostazioni della sessione o da fattori esterni. La maggior parte delle funzioni matematiche sono immutabili. Ecco alcuni esempi di funzioni:
Funzioni di manipolazione delle stringhe, come
CONCATeLOWERFunzioni di formattazione di data e ora con input espliciti
Le funzioni che dipendono da impostazioni configurabili in fase di runtime, come il fuso orario, non sono immutabili perché i loro risultati possono variare a seconda delle diverse configurazioni di database o sessione.
Stabile: una funzione è stabile se restituisce gli stessi risultati per gli stessi valori degli argomenti all'interno di una singola esecuzione dell'istruzione. Tuttavia, il suo risultato può variare a seconda delle diverse istruzioni SQL. Funzioni come
CURRENT_TIMESTAMP,CURRENT_DATEe funzioni simili basate sul tempo sono stabili. Ad esempio, più chiamate aCURRENT_TIMESTAMPall'interno della stessa istruzioneSELECTproducono lo stesso timestamp, ma le istruzioni successive potrebbero produrre un timestamp diverso.Volatile: una funzione è volatile se il suo valore può cambiare anche all'interno di una singola esecuzione dell'istruzione con gli stessi argomenti. Ad esempio, la funzione
GENERATE_UUID, che genera un ID univoco, è volatile.
Implicazioni della volatilità
La categoria di volatilità di una funzione determina dove può essere utilizzata nello schema del database e come vengono ottimizzate le query che contengono la funzione:
Colonne generate:le espressioni che definiscono le colonne generate devono essere immutabili. In questo modo, il valore memorizzato è deterministico in base alle altre colonne della riga. Spanner genera un errore se tenti di definire una colonna generata con un'espressione non immutabile.
Indicizzazione:non puoi creare indici su espressioni che coinvolgono funzioni volatili. Spanner genera un errore se provi a creare un indice su un'espressione che coinvolge funzioni volatili.
Ottimizzazione delle query:lo strumento di ottimizzazione delle query utilizza le informazioni sulla volatilità per eseguire le ottimizzazioni. Ad esempio, l'ottimizzatore delle query precalcola le chiamate a funzioni immutabili con argomenti costanti. L'ottimizzatore spesso memorizza nella cache i risultati delle funzioni stabili nell'ambito dell'esecuzione di una singola istruzione.