Volatilità della funzione

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:

    • ABS

    • LENGTH

    • Funzioni di manipolazione delle stringhe, come CONCAT e LOWER

    • Funzioni 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_DATE e funzioni simili basate sul tempo sono stabili. Ad esempio, più chiamate a CURRENT_TIMESTAMP all'interno della stessa istruzione SELECT producono 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.