Syntax und Zeitmarken von Time Travel-Abfragen

Abfragesyntax

Eine SELECT-Abfrage mit einer oder mehreren temporalen Klauseln ist eine Time-Travel-Abfrage. Zeitabfragen können als untergeordnete SELECT-Anweisungen in den Anweisungen INSERT, UPDATE, DELETE, MERGE oder CREATE TABLE AS SELECT (CTAS) erscheinen.

Außerdem können Zeitabfragen in einer Sichtdefinition (CREATE VIEW mit oder ohne OR REPLACE) oder in einer Definition einer gespeicherten Prozedur (CREATE PROCEDURE mit oder ohne OR REPLACE) angezeigt werden. In beiden Fällen werden Zeitmarkenausdrücke in der Syntax (z. B. CURRENT_TIMESTAMP - INTERVAL ‘1 day’) nicht bei der Anzeige-oder Prozedurdefinition ausgewertet, sondern zu dem Zeitpunkt, zu dem ein Benutzer oder eine Anwendung die Ansicht abfragt oder die Prozedur aufruft.

Jeder Basistabellenverweis (der Tabellenname mit oder ohne Datenbank-und Schemanamen und mit oder ohne Aliasnamen) in einer SELECT oder sub-SELECT kann eine optionale temporale Klausel enthalten, die aus den Schlüsselwörtern FOR SYSTEM_TIME gefolgt von einem der folgenden Werte besteht:

  • AS OF <TIMESTAMP EXPRESSION>
  • BEFORE <TIMESTAMP EXPRESSION>
  • BETWEEN <TIMESTAMP EXPRESSION 1> AND <TIMESTAMP EXPRESSION 2>
  • FROM <TIMESTAMP EXPRESSION 1> TO <TIMESTAMP EXPRESSION 2>

Jede TIMESTAMP EXPRESSION muss eine der folgenden sein:

  • Ein literaler Zeitmarkenwert. Beispiel: ‘2022-10-31 20:00:00’.
  • Ein Abfrageparameter oder eine Hostvariable, deren Wert eine Zeitmarke ist.
  • Eine integrierte Funktion, die eine Zeitmarke zurückgibt oder implizit in eine Zeitmarke konvertiert. Beispiel: CURRENT_DATE, CURRENT_TIMESTAMP oder (äquivalent) NOW() oder CURRENT_TIMESTAMP(subsecond-digits) oder (äquivalent) NOW(subsecond-digits).
  • Ein Ausdruck, der für alle Zeilen in der Tabelle eine einzelne Zeitmarke ergibt. Beispiel: CURRENT_TIMESTAMP - INTERVAL ‘1 day’. Der Ausdruck kann nicht auf Tabellenspalten oder auf eine nicht deterministische Funktion (z. B. RANDOM()) verweisen oder ein Sub-SELECT sein.
  • Die Sonderkennung RETENTION_START_TIMESTAMP in den besonderen Fällen von AS OF, BETWEEN und FROM (aber nicht BEFORE, AND oder TO) Dies bezieht sich auf die Zeitmarke für den Aufbewahrungsstart. Dies ist die älteste mögliche Zeitmarke für das Einfügen oder Löschen von Zeilen, die für Zeitreihenabfragen verfügbar ist. Weitere Informationen zu Zeitmarken für den Start der Aufbewahrungsdauer, zum Einfügen von Zeitmarken und zum Löschen von Zeitmarken finden Sie unter Zeitmarken in Zeitreiseabfragen.

Stand

Sie können die Unterklausel AS OF verwenden, wenn Sie den Status Ihrer Daten zu einem beliebigen Zeitpunkt in der Vergangenheit abrufen möchten.

Syntax Beschreibung
AS OF < ZEITMARKENAUSDRUCK 1 > Schließt alle Zeilen ein, die an der Zeitmarke gültig waren, zu der TIMESTAMP EXPRESSION 1 ausgewertet wird, deren Einfügezeitmarke kleiner-gleich TIMESTAMP EXPRESSION 1 ist und deren Löschzeitmarke NULL oder größer als TIMESTAMP EXPRESSION 1 ist. Ist TIMESTAMP EXPRESSION 1 kleiner als die Zeitmarke für den Aufbewahrungsstart der Tabelle, wird ein Fehler zurückgegeben.

VORHER

Sie können die Unterklausel BEFORE verwenden, wenn Sie den Status Ihrer Daten so abrufen möchten, wie er kurz vor einem bestimmten Zeitpunkt in der Vergangenheit war.

Syntax Beschreibung
vor<TIMESTAMP EXPRESSION 1> Schließt alle Zeilen ein, die unmittelbar vor der Zeitmarke gültig waren, mit der TIMESTAMP EXPRESSION 1 ausgewertet wird. Deren Einfügezeitmarke ist streng kleiner als TIMESTAMP EXPRESSION 1 und deren Löschzeitmarke ist NULL oder größer als TIMESTAMP EXPRESSION 1. Wenn TIMESTAMP EXPRESSION 1 kleiner-gleich der Zeitmarke für den Aufbewahrungsstart der Tabelle ist, wird ein Fehler zurückgegeben.

VON ...TO und BETWEENUND

Sie können FROM ...TO und BETWEEN ...AND-Unterklauseln für Datenprüfung oder Trendanalyse. Verwenden Sie diese Option, wenn Sie die gesamte Langzeittransformation für einige oder alle Zeilen über einen bestimmten Zeitraum abrufen müssen.

Syntax Beschreibung
FROM < ZEITMARKENAUSDRUCK 1 > TO < ZEITMARKENAUSDRUCK 2 > Schließt alle Zeilen ein, die zu einem beliebigen Zeitpunkt gültig waren, von TIMESTAMP EXPRESSION 1 bis TIMESTAMP EXPRESSION 2 (exclusive), deren Einfügezeitmarke streng kleiner als TIMESTAMP EXPRESSION 2 ist und deren Löschzeitmarke null oder größer als TIMESTAMP EXPRESSION 1 ist. Wenn TIMESTAMP EXPRESSION 1 oder TIMESTAMP EXPRESSION 2 kleiner-gleich der Zeitmarke für den Aufbewahrungsstart der Tabelle ist, wird ein Fehler zurückgegeben. Wenn TIMESTAMP EXPRESSION 1 größer-gleich TIMESTAMP EXPRESSION 2 ist, erzeugt die Abfrage keine Zeilen.
Zwischen <TIMESTAMP EXPRESSION 1> und <TIMESTAMP EXPRESSION 2> Schließt alle Zeilen ein, die zu einem beliebigen Zeitpunkt zwischen TIMESTAMP EXPRESSION 1 und TIMESTAMP EXPRESSION 2 (einschließlich) gültig waren, deren Einfügezeitmarke kleiner-gleich TIMESTAMP EXPRESSION 2 und deren Löschzeitmarke NULL ist oder größer als TIMESTAMP EXPRESSION 1 ist. Wenn TIMESTAMP EXPRESSION 1 oder TIMESTAMP EXPRESSION 2 kleiner als die Zeitmarke für den Aufbewahrungsstart der Tabelle ist, wird ein Fehler zurückgegeben. Wenn TIMESTAMP EXPRESSION 1 größer als TIMESTAMP EXPRESSION 2 ist, erzeugt die Abfrage keine Zeilen.

Zeitmarken in Zeitreiseabfragen

Aufbewahrungszeitintervall und Aufbewahrungszeitraum

Das Aufbewahrungszeitintervall einer Tabelle definiert die Anzahl der Tage nach dem Löschen der Zeitmarken, die archivierte (gelöschte) Zeilen für Zeitreihenabfragen zur Verfügung stehen. Der Aufbewahrungszeitraum endet zu einem beliebigen Zeitpunkt mit der aktuellen Zeitmarke (Datum und Uhrzeit) und verlängert die angegebene Anzahl von Tagen. Dies ist ein gleitendes Zeitfenster, das mit der aktuellen Systemzeit fortschreitet.

Untergrenze für Aufbewahrung

Zum größten Teil ist die Untergrenze für die Aufbewahrung einer Tabelle der Zeitpunkt (Datum und Uhrzeit), zu dem die Tabelle als temporale Tabelle definiert wurde. Dies könnte der Fall gewesen gewesen sein, als Sie den Befehl CREATE TABLE ausgeführt haben oder als Sie das letzte Mal die DATA_VERSION_RETENTION_TIME der Tabelle von null in ungleich null geändert haben.

Zeitmarke für Beginn der Aufbewahrungsdauer

Zum Zeitpunkt der Definition einer Tabelle als temporale Tabelle (wenn die Untergrenze für die Aufbewahrung definiert ist) sind über den Aufbewahrungszeitraum keine Protokollzeilen verfügbar. Um die Vorstellung zu erfassen, wie weit zurückliegenden Protokollzeilen tatsächlich verfügbar sind (für Zeitreiseabfragen sichtbar), wird die Zeitmarke für den Aufbewahrungsstart einer Tabelle definiert. Die Zeitmarke für den Aufbewahrungsstart ist der größere der folgenden Werte:

  • Der Beginn des Aufbewahrungszeitraums (das aktuelle Datum/die aktuelle Uhrzeit minus dem Aufbewahrungsintervall)
  • Die Untergrenze für den Aufbewahrungszeitraum

Die Zeitmarke für den Aufbewahrungsstart einer Tabelle wird in den folgenden Operationen verwendet:

  • Zeitreiseabfragen (SELECT und sub-SELECT)

    Wenn Sie versuchen, Abfragen für Protokollzeilen auszuführen, die vor der Zeitmarke für den Aufbewahrungsstart gelöscht wurden, wird ein Fehler zurückgegeben.

    Wenn Sie Protokolldaten so weit wie möglich zurückfragen möchten, können Sie das Schlüsselwort RETENTION_START_TIMESTAMP in Zeitreiseabfragen verwenden. Wenn Sie dies tun, können Sie vermeiden, dass Sie die richtige Zeitmarke selbst berechnen müssen. Durch die Erweiterung eliminieren Sie das Risiko, dass ein Fehler auftritt, wenn der Wert zu alt ist (älter als die Zeitmarke für den Aufbewahrungsstart).

  • GROOM TABLE Protokollzeilen, die vor der Zeitmarke für den Aufbewahrungsstart gelöscht wurden, werden nicht mehr für Zeitabfragen benötigt und können freigegeben werden.

Zeilenzeitmarken und Gültigkeit

Die Einfügezeitmarke einer aktuellen oder archivierten Zeile ist der Zeitpunkt (Datum/Uhrzeit), zu dem die Transaktion, die die Zeile eingefügt hat, festgeschrieben wurde. Es ist nicht der Zeitpunkt, zu dem eine bestimmte Anweisung INSERT, UPDATE oder MERGE ausgeführt wurde, die die Zeile eingefügt hat.

Wenn die Einfügetransaktion für eine Zeile vor der Zeitmarke für den Aufbewahrungsstart festgeschrieben wurde, wird die Zeile so behandelt, als wäre sie bei der Zeitmarke für den Aufbewahrungsstart eingefügt worden. Dies gilt im Allgemeinen nur für vorhandene Zeilen zum Zeitpunkt der Änderung einer nicht temporalen Tabelle in eine temporale Tabelle.

Eine eingefügte Zeile, deren Transaktion noch nicht festgeschrieben wurde, hat keine Einfügezeitmarke. Eine solche Zeile ist für eine Zeitreiseabfrage nie sichtbar.

In einer Zeitreiseabfrage können Sie die Einfügezeitmarke auswählen, indem Sie die virtuelle Spalte _SYS_START einer temporalen Tabelle verwenden.

Die Zeitmarke für das Löschen einer archivierten Zeile ist der Zeitpunkt (Datum/Uhrzeit), zu dem die Transaktion das Löschen der Zeile festgeschrieben hat. Es ist nicht der Zeitpunkt, an dem eine bestimmte Anweisung DELETE, UPDATE, MERGE oder TRUNCATE ausgeführt wurde, die die Zeile gelöscht hat.

Wenn eine temporale Tabelle abgeschnitten wird, sind die vorhandenen Tabellenzeilen für Time-Travel-Abfragen verfügbar und werden so behandelt, als ob sie gelöscht wurden, als die Abschneidetransaktion festgeschrieben wurde.

Wenn die Löschtransaktion (oder Abschneidetransaktion) vor der Zeitmarke für den Aufbewahrungsstart festgeschrieben wurde, wird eine gelöschte Zeile so behandelt, als wäre sie mit der Zeitmarke für den Aufbewahrungsstart gelöscht worden. Dies gilt im Allgemeinen nur für vorhandene gelöschte Zeilen zum Zeitpunkt der Änderung einer nicht temporalen Tabelle in eine temporale Tabelle; solche Zeilen sind für Zeitreiseabfragen für die Tabelle nicht sichtbar.

Eine Protokollzeile kann für eine temporale Abfrage für die Tabelle sichtbar sein, wenn ihre Löschzeitmarke innerhalb des Aufbewahrungszeitraums der Tabelle liegt. Wenn diese Bedingung wahr ist, kann die Protokollzeile (mit GROOM TABLE) nicht aus der Tabelle entfernt werden.

Die Löschzeitmarke einer aktuellen Zeile (nicht gelöscht oder zum Löschen markiert, aber nicht festgeschrieben) ist NULL.

In einer Zeitreiseabfrage können Sie die Löschzeitmarke auswählen, indem Sie die virtuelle Spalte _SYS_END einer temporalen Tabelle verwenden.

Eine Protokollzeile wird von ihrer Einfügezeitmarke bis unmittelbar vor der Löschzeitmarke als gültig betrachtet. Eine aktuelle Zeile wird ab ihrer Einfügezeitmarke als gültig betrachtet. Zeitreihenabfragen verwenden Zeitmarken oder Zeitmarkenausdrücke, um nur Zeilen (aktuelle oder Langzeitdaten) zurückzugeben, die zu einem Zeitpunkt oder zu einem beliebigen Zeitpunkt innerhalb eines Zeitraums gültig sind.

Die Einfüge-und Löschzeitmarken für kürzlich eingefügte und gelöschte Zeilen sind möglicherweise erst nach einer kurzen Zeit (in der Regel unter 3 Minuten) nach dem Festschreiben der Einfüge-und Löschtransaktionen für Zeitabfragen verfügbar.