Dans Spanner, les fonctions, y compris les fonctions SQL intégrées et celles définies par l'utilisateur, sont classées en fonction de leur volatilité. La catégorie de volatilité indique si une fonction renvoie le même résultat lorsque vous l'appelez avec les mêmes arguments. Cette classification a une incidence sur la façon dont l'optimiseur de requêtes gère la fonction et sur l'endroit où vous pouvez l'utiliser, par exemple dans des expressions de colonne générées ou des définitions d'index. Comprendre la volatilité des fonctions vous aide à écrire des requêtes et des schémas plus prévisibles et plus performants dans Spanner.
Il existe trois catégories de volatilité, qui sont semblables à des concepts dans des systèmes tels que PostgreSQL :
Immuable : une fonction est immuable si elle renvoie les mêmes résultats lorsque vous l'appelez avec les mêmes valeurs d'argument. Ce comportement signifie que le résultat de la fonction ne dépend que de ses arguments d'entrée, et non de l'état de la base de données, des paramètres de session ou de facteurs externes. La plupart des fonctions mathématiques sont immuables. Voici quelques exemples de fonctions immuables :
Fonctions de manipulation de chaînes, telles que
CONCATetLOWERFonctions de mise en forme de la date et de l'heure avec des entrées explicites
Les fonctions qui dépendent de paramètres configurables au moment de l'exécution, tels que time zone, ne sont pas immuables, car leurs résultats peuvent varier en fonction des configurations de la base de données ou de la session.
Stable : une fonction est stable si elle renvoie les mêmes résultats pour les mêmes valeurs d'argument au cours de l'exécution d'une seule instruction. Toutefois, son résultat peut changer d'une instruction SQL à l'autre. Les fonctions telles que
CURRENT_TIMESTAMP,CURRENT_DATE, et les fonctions temporelles similaires sont stables. Par exemple, plusieurs appels àCURRENT_TIMESTAMPdans la même instructionSELECTgénèrent le même code temporel, mais les instructions suivantes peuvent générer un code temporel différent.Volatile : une fonction est volatile si sa valeur peut changer même au cours de l'exécution d'une seule instruction avec les mêmes arguments. Par exemple, la
GENERATE_UUIDfonction, qui génère un ID unique, est volatile.
Implications de la volatilité
La catégorie de volatilité d'une fonction détermine où elle peut être utilisée dans votre schéma de base de données et comment les requêtes contenant la fonction sont optimisées :
Colonnes générées : les expressions qui définissent des colonnes générées doivent être immuables. Cela garantit que la valeur stockée est déterministe en fonction des autres colonnes de la ligne. Spanner génère une erreur si vous essayez de définir une colonne générée avec une expression qui n'est pas immuable.
Indexation : vous ne pouvez pas créer d'index sur des expressions impliquant des fonctions volatiles. Spanner génère une erreur si vous essayez de créer un index sur une expression impliquant des fonctions volatiles.
Optimisation des requêtes : l'optimiseur de requêtes utilise des informations sur la volatilité pour effectuer des optimisations. Par exemple, l' optimiseur de requêtes précalcule les appels aux fonctions immuables avec des arguments constants. L'optimiseur met souvent en cache les résultats des fonctions stables dans le champ d'application de l'exécution d'une seule instruction.