Funktionsvolatilität

In Spanner werden Funktionen, einschließlich integrierter SQL- und benutzerdefinierter Funktionen, nach ihrer Flüchtigkeit klassifiziert. Die Flüchtigkeitskategorie gibt an, ob eine Funktion dasselbe Ergebnis zurückgibt, wenn Sie sie mit denselben Argumenten aufrufen. Diese Klassifizierung wirkt sich darauf aus, wie der Abfrageoptimierer die Funktion verarbeitet und wo Sie die Funktion verwenden können, z. B. in Ausdrücken für generierte Spalten oder Indexdefinitionen. Wenn Sie die Flüchtigkeit von Funktionen verstehen, können Sie in Spanner vorhersehbarere und leistungsfähigere Abfragen und Schemas schreiben.

Es gibt drei Flüchtigkeitskategorien, die Konzepten in Systemen wie PostgreSQL ähneln:

  • Unveränderlich: Eine Funktion ist unveränderlich, wenn sie bei Aufruf mit denselben Argumentwerten dieselben Ergebnisse zurückgibt. Das bedeutet, dass das Ergebnis der Funktion nur von den Eingabeargumenten und nicht vom Datenbankstatus, den Sitzungseinstellungen oder externen Faktoren abhängt. Die meisten mathematischen Funktionen sind unveränderlich. Beispiele für Funktionen sind:

    • ABS

    • LENGTH

    • Stringmanipulationsfunktionen wie CONCAT und LOWER

    • Funktionen zur Formatierung von Datum und Uhrzeit mit expliziten Eingaben

    Funktionen, die von zur Laufzeit konfigurierbaren Einstellungen wie der Zeit zone, abhängen, sind nicht unveränderlich, da ihre Ergebnisse je nach Datenbank- oder Sitzungskonfiguration variieren können.

  • Stabil: Eine Funktion ist stabil, wenn sie für die selben Argumentwerte innerhalb einer einzelnen Anweisungsausführung dieselben Ergebnisse zurückgibt. Das Ergebnis kann sich jedoch bei verschiedenen SQL-Anweisungen ändern. Funktionen wie CURRENT_TIMESTAMP, CURRENT_DATE, und ähnliche zeitbasierte Funktionen sind stabil. Beispielsweise liefern mehrere Aufrufe von CURRENT_TIMESTAMP innerhalb derselben SELECT-Anweisung denselben Zeitstempel, nachfolgende Anweisungen können jedoch einen anderen Zeitstempel erzeugen.

  • Flüchtig: Eine Funktion ist flüchtig, wenn sich ihr Wert auch innerhalb einer einzelnen Anweisungsausführung mit denselben Argumenten ändern kann. Beispielsweise ist die GENERATE_UUID Funktion, die eine eindeutige ID generiert, flüchtig.

Auswirkungen der Flüchtigkeit

Die Flüchtigkeitskategorie einer Funktion bestimmt, wo sie in Ihrem Datenbankschema verwendet werden kann und wie Abfragen, die die Funktion enthalten, optimiert werden:

  • Generierte Spalten:Ausdrücke, die generierte Spalten definieren, müssen unveränderlich sein. So wird sichergestellt, dass der gespeicherte Wert deterministisch auf den anderen Spalten in der Zeile basiert. Spanner gibt einen Fehler aus, wenn Sie versuchen, eine generierte Spalte mit einem Ausdruck zu definieren, der nicht unveränderlich ist.

  • Indexierung:Sie können keine Indexe für Ausdrücke erstellen, die flüchtige Funktionen enthalten. Spanner gibt einen Fehler aus, wenn Sie versuchen, einen Index für einen Ausdruck zu erstellen, der flüchtige Funktionen enthält.

  • Abfrageoptimierung:Der Abfrageoptimierer verwendet Informationen zur Flüchtigkeit, um Optimierungen vorzunehmen. Beispielsweise berechnet der Abfrageoptimierer Aufrufe unveränderlicher Funktionen mit konstanten Argumenten vor. Der Optimierer speichert Ergebnisse stabiler Funktionen häufig im Cache, und zwar im Rahmen der Ausführung einer einzelnen Anweisung.