タイム・トラベル照会の構文とタイム・スタンプ
照会構文
1 つ以上のテンポラル節を持つ SELECT 照会は、タイム・トラベル照会です。 タイム・トラベル照会は、 INSERT、 UPDATE、 DELETE、 MERGE、または CREATE TABLE AS SELECT (CTAS) ステートメントで sub-SELECT として表示されることがあります。
また、タイム・トラベル照会は、ビュー定義 (CREATE VIEW、 OR REPLACE の有無にかかわらず) またはストアード・プロシージャー定義 (CREATE PROCEDURE、 OR REPLACE の有無にかかわらず) に現れることがあります。 どちらの場合も、構文のタイム・スタンプ式 (例えば、 CURRENT_TIMESTAMP - INTERVAL ‘1 day’)
は、ビューまたはプロシージャーの定義時には評価されませんが、ユーザーまたはアプリケーションがビューを照会したり、プロシージャーを呼び出すときに評価されます。
SELECT または sub-SELECT の基本表参照 (表名、データベース名とスキーマ名の有無、および別名の有無) には、キーワード FOR SYSTEM_TIME とそれに続く以下のいずれかの値で構成されるオプションのテンポラル節が含まれる場合があります。
AS OF <TIMESTAMP EXPRESSION>BEFORE <TIMESTAMP EXPRESSION>BETWEEN <TIMESTAMP EXPRESSION 1> AND <TIMESTAMP EXPRESSION 2>FROM <TIMESTAMP EXPRESSION 1> TO <TIMESTAMP EXPRESSION 2>
各 TIMESTAMP EXPRESSION は、以下のいずれかでなければなりません。
- リテラル・タイム・スタンプ値。 例えば、
‘2022-10-31 20:00:00’です。 - 値がタイム・スタンプである照会パラメーターまたはホスト変数。
- タイム・スタンプを戻す、またはタイム・スタンプに暗黙的に変換する組み込み関数。 例えば、
CURRENT_DATE、CURRENT_TIMESTAMPまたは (同等)NOW()、またはCURRENT_TIMESTAMP(subsecond-digits)または (同等)NOW(subsecond-digits)などです。 - 表内のすべての行について単一のタイム・スタンプに評価される式。 例えば、
CURRENT_TIMESTAMP - INTERVAL ‘1 day’です。 式は、表の列や非決定論的関数 (RANDOM()など) を参照したり、 副 SELECT にしたりすることはできません。 - 特殊 ID RETENTION_START_TIMESTAMP。 AS OF、 BETWEEN、および FROM の特定の場合 (ただし、 BEFORE、 AND、または TO は除く)。 これは、保存開始タイム・スタンプを参照します。これは、タイム・トラベル照会に使用できる最も古い行挿入タイム・スタンプまたは削除タイム・スタンプです。 保存開始タイム・スタンプ、挿入タイム・スタンプ、および削除タイム・スタンプについて詳しくは、 タイム・スタンプのタイム・トラベル照会 を参照してください。
日付
AS OF サブ節は、過去の特定の時点でのデータの状態を検索する場合に使用できます。
| 構文 | 説明 |
|---|---|
| AS OF < タイム・スタンプ式 1> | TIMESTAMP EXPRESSION 1 が評価されるタイム・スタンプで有効であった行のうち、挿入タイム・スタンプが TIMESTAMP EXPRESSION 1 以下であり、削除タイム・スタンプが NULL または TIMESTAMP EXPRESSION 1 より大きい行をすべて含みます。 TIMESTAMP EXPRESSION 1 が表の保存開始タイム・スタンプより小さい場合は、エラーが戻されます。 |
前
BEFORE サブ節は、過去の特定の時刻の直前のデータの状態を取得する場合に使用できます。
| 構文 | 説明 |
|---|---|
| 前<TIMESTAMP EXPRESSION 1> | TIMESTAMP EXPRESSION 1 が評価されるタイム・スタンプの直前に有効であったすべての行が含まれます。 挿入タイム・スタンプが厳密に TIMESTAMP EXPRESSION 1 より小さく、削除タイム・スタンプが NULL であるか、TIMESTAMP EXPRESSION 1 より大きい。 TIMESTAMP EXPRESSION 1 が表の保存開始タイム・スタンプ以下の場合は、エラーが戻されます。 |
送信元 ...終了 (TO) と終了 (BETWEEN)...AND 型
FROM ... を使用できます。TO と BETWEEN ...データ監査またはトレンド分析のための AND 副節。 一定期間にわたる一部またはすべての行について、すべての履歴変換を取得する必要がある場合に使用します。
| 構文 | 説明 |
|---|---|
| FROM < タイム・スタンプ式 1> TO < タイム・スタンプ式 2> | 挿入タイム・スタンプが厳密に TIMESTAMP EXPRESSION 2 より小さく、削除タイム・スタンプが NULL であるか、または TIMESTAMP EXPRESSION 1 より大きい、TIMESTAMP EXPRESSION 2 (排他的) の任意の時点で有効であったすべての行が含まれます。 TIMESTAMP EXPRESSION 1 または TIMESTAMP EXPRESSION 2 が表の保存開始タイム・スタンプより小さいか等しい場合は、エラーが戻されます。 TIMESTAMP EXPRESSION 1 が TIMESTAMP EXPRESSION 2 より大きいか等しい場合、照会は行を生成しません。 |
| <TIMESTAMP EXPRESSION 1> と <TIMESTAMP EXPRESSION 2> の間 | 挿入タイム・スタンプが TIMESTAMP EXPRESSION 2 以下で、削除タイム・スタンプが NULL であるか TIMESTAMP EXPRESSION 1 より大きい、TIMESTAMP EXPRESSION 1 と TIMESTAMP EXPRESSION 2 の間の任意の時点で有効であったすべての行を含みます。 TIMESTAMP EXPRESSION 1 または TIMESTAMP EXPRESSION 2 が表の保存開始タイム・スタンプより小さい場合は、エラーが戻されます。 TIMESTAMP EXPRESSION 1 が TIMESTAMP EXPRESSION 2 より大きい場合、照会は行を作成しません。 |
タイム・トラベル照会のタイム・スタンプ
保存時間間隔および保存期間
表の保存時間間隔は、タイム・トラベル照会で履歴 (削除済み) 行を使用できる削除タイム・スタンプの経過日数を定義します。 任意の時点で、保存期間は現在のタイム・スタンプ (日時) で終了し、指定された日数だけ延長されます。 これは、現在のシステム時刻が進むにつれて進むスライディング・タイム・ウィンドウです。
保存の下限
ほとんどの場合、表の保存期間の下限は、表がテンポラル表として定義された日時です。 これは、 CREATE TABLE コマンドを実行したとき、または表の DATA_VERSION_RETENTION_TIME を最後にゼロからゼロ以外に変更したときに発生した可能性があります。
保存開始タイム・スタンプ
表をテンポラル表として定義する時点 (保存期間の下限が定義されている場合) では、保存期間中に使用可能な履歴行はありません。 履歴行がどの程度実際に使用可能か (タイム・トラベル照会で表示可能か) の概念をキャプチャーするために、表の保存開始タイム・スタンプが定義されます。 保存開始タイム・スタンプは、以下の値のうち大きい方の値です。
- 保存期間の開始 (現在の日付/時刻から保存間隔を引いたもの)。
- 保存の下限。
表の保存開始タイム・スタンプは、以下の操作で使用されます。
-
タイム・トラベル照会 (SELECT および sub-SELECT)
保存開始タイム・スタンプの前に削除された履歴行に対して照会を実行しようとすると、エラーが返されます。
ヒストリカル・データをできるだけさかのぼって照会する場合は、タイム・トラベル照会で RETENTION_START_TIMESTAMP キーワードを使用できます。 これを行うと、自分で正しいタイム・スタンプを計算する必要がなくなります。 拡張すると、値が古すぎる (保存開始タイム・スタンプより古い) ことが判明した場合にエラーが発生するリスクを除去できます。
-
GROOM TABLE 保存開始タイム・スタンプより前に削除された履歴行は、タイム・トラベル照会には不要になり、再利用できます。
行のタイム・スタンプと妥当性
現在行または履歴行の挿入タイム・スタンプは、行を挿入するトランザクションがコミットした日時です。 これは、行を挿入した特定の INSERT、 UPDATE、または MERGE ステートメントが実行された時刻ではありません。
行の挿入トランザクションが保存開始タイム・スタンプより前にコミットされた場合、その行は保存開始タイム・スタンプで挿入されたものとして扱われます。 これは通常、テンポラル表からテンポラル表への非テンポラル表の変更時に既存の行にのみ適用されます。
トランザクションがまだコミットされていない挿入行には、挿入タイム・スタンプはありません。 このような行は、タイム・トラベル照会には表示されません。
タイム・トラベル照会では、テンポラル表の _SYS_START 仮想列を使用して挿入タイム・スタンプを選択できます。
履歴行の削除タイム・スタンプは、その行を削除するトランザクションがコミットした日時です。 これは、行を削除した特定の DELETE、 UPDATE、 MERGE、または TRUNCATE ステートメントが実行された時刻ではありません。
テンポラル表が切り捨てられると、タイム・トラベル照会で既存の表の行が使用可能になり、切り捨てトランザクションがコミットされた時点で削除されたものとして扱われます。
削除 (または切り捨て) トランザクションが保存開始タイム・スタンプより前にコミットされた場合、削除された行は保存開始タイム・スタンプ時に削除されたものとして扱われます。 これは通常、テンポラル表からテンポラル表への非テンポラル表の変更時に既存の削除済み行にのみ適用されます。そのような行は、表に対するタイム・トラベル照会には表示されません。
表の削除タイム・スタンプが表の保存期間内にある場合、表に対するテンポラル照会で履歴行が表示されることがあります。 この条件が true の場合、履歴行を ( GROOM TABLE を指定して) 表から削除することはできません。
現在行の削除タイム・スタンプ (削除されていない、または削除のマークが付けられているがコミットされていない) が NULL です。
タイム・トラベル照会では、テンポラル表の _SYS_END 仮想列を使用して削除タイム・スタンプを選択できます。
履歴行は、挿入タイム・スタンプから削除タイム・スタンプの直前までの間、有効であると見なされます。 現在行は、挿入タイム・スタンプの順方向から有効であると見なされます。 タイム・トラベル照会は、タイム・スタンプまたはタイム・スタンプ式を使用して、特定の時点または期間内の任意の時点で有効な行 (現在または履歴) のみを返します。
最近挿入および削除された行の挿入および削除のタイム・スタンプは、トランザクションの挿入および削除がコミットされてから少し (通常は 3 分未満) 経過するまで、タイム・トラベル照会に使用できない可能性があります。