- カテゴリ:
AT | BEFORE¶
AT または BEFORE 句は、Snowflake Time Travelに使用されます。クエリでは、テーブル名の直後の FROM 句で指定され、オブジェクトの履歴データが要求される過去のポイントを決定します。
AT キーワードは、指定されたパラメーターに等しいタイムスタンプを持つステートメントまたはトランザクションによる変更がリクエストに含まれることを指定します。
BEFORE キーワードは、リクエストが指定されたパラメーターの直前のポイントを参照するように指定します。このポイントは、クエリー ID で識別されるステートメントが完了する直前です。詳細については、 BEFORE 句の使用 をご参照ください。
同じ構文を使用してオブジェクトをクローンできます。/sql-reference/sql/create-clone`をご参照ください。クローンの 時点を指定しない場合、クローンはデフォルトで現在のオブジェクトの状態に なります( :doc:/sql-reference/functions/current_timestamp` 値)。
詳細については、 Time Travelの理解と使用 をご参照ください。
- こちらもご参照ください。
構文¶
パラメーター¶
TIMESTAMP => timestampTime Travelに使用する正確な日付と時刻を指定します。値は明示的に TIMESTAMP、 TIMESTAMP_LTZ、 TIMESTAMP_NTZ、または TIMESTAMP_TZ にキャストする必要があります。
明示的なキャストが指定されていない場合、 AT 句のタイムスタンプは、 UTC のタイムゾーン (TIMESTAMP_NTZと同等)のタイムスタンプとして扱われます。明示的なキャストで TIMESTAMP データ型を使用すると、値が TIMESTAMP_NTZ 値として扱われる場合があります。詳細については、 日付と時刻のデータ型 をご参照ください。
OFFSET => time_differenceTime Travelに使用する現在の時刻との差を秒単位で
-Nの形式で指定します。Nは整数または数式です(例:-120は120秒、-30*60は1800秒または30分)。STATEMENT => idTime Travelの参照ポイントとして使用するステートメントのクエリ ID を指定します。このパラメーターは、次のいずれかのタイプのステートメントをサポートします。
DML (例: INSERT、 UPDATE、 DELETE)
TCL (BEGIN、 COMMIT トランザクション)
SELECT
クエリ ID は、過去14日以内に実行されたクエリを参照する必要があります。クエリ ID が14日以上経過したクエリを参照している場合は、次のエラーが返されます。
この制限を回避するには、参照されるクエリのタイムスタンプを使用します。
STREAM => 'name'クエリされたテーブルまたはビューの既存のストリームに対する識別子(つまり、名前)を指定します。ストリーム内の現在のオフセットは、ソースオブジェクトの変更データを返すための
ATまたは:code:`BEFORE`時点として使用されます。このキーワードは、ストリームを作成(CREATE STREAM を使用)または変更データをクエリ( CHANGES 句を使用)するの場合にのみサポートされます。例については、次のトピックを参照してください。
AT TIMESTAMP パラメーターの使用¶
AT 句では、 TIMESTAMP キーワードの後に、タイムスタンプを表す文字列と、オプションで TIMESTAMP、 TIMESTAMP_TZ、 TIMESTAMP_LTZ、 TIMESTAMP_NTZ データ型への明示的なキャストを指定することができます。次の例はすべて有効です。
明示的なキャストが指定されていない場合、 AT 句のタイムスタンプは、 UTC のタイムゾーン (TIMESTAMP_NTZと同等)のタイムスタンプとして扱われます。明示的なキャストで TIMESTAMP データ型を使用すると、 日付と時刻のデータ型 で説明したように、値が TIMESTAMP_NTZ 値として扱われる場合があります。
タイムスタンプはセッションの現在のタイムゾーンおよび TIMESTAMP_TYPE_MAPPING パラメータの値を基準に解釈されるため、選択した明示的なキャストはTime Travelクエリの結果に影響されます。この動作の詳細については、 UTC タイムゾーン以外のセッションでのTime Travelデータのクエリ を参照してください。
例えば、現在のタイムゾーンが America/Los_Angeles で、 TIMESTAMP_TYPE_MAPPING が TIMESTAMP_NTZ に設定されている SQL セッションでクエリを実行しているとします。例えば、テーブルを作成し、そこに2つの行を挿入します。
SHOW TABLES コマンドで、テーブルの作成時間をチェックします。
created_on 列のタイムゾーンオフセットに注目します。5分後に、もう1行挿入します。
ここで、次のTime Travelクエリを実行します。最初の2行が返されるはずです。
クエリー失敗します。セッションのタイムゾーンは UTC であり、 TIMESTAMP への明示的なキャストはそのタイムゾーンに従うからです。そのため、テーブルは指定されたタイムスタンプよりも 後 に作成されたものとみなされます。この問題を解決するには、 TIMESTAMP_LTZ (ローカルタイムゾーン)に明示的にキャストしてクエリを再実行します。
予想どおり、挿入された最初の2行がクエリから返されます。最後に同じクエリを、少し後のタイムスタンプを指定して実行します。
このクエリは、指定されたタイムスタンプを持つ3行すべてを返します。
BEFORE 句の使用¶
BEFORE 句の STATEMENT パラメータは、クエリ ID を参照する必要があります。Time Travelが使用する過去の時点は、ステートメントの開始前ではなく、そのクエリ ID のステートメントの完了直前です。同時実行クエリがステートメントの開始と終了の間にデータの変更をコミットした場合、これらの変更は結果に含まれます。
たとえば、以下のステートメントは、テーブル my_table の2つのスレッドで並行して実行されます。
時間 |
スレッド |
操作 |
フェーズ |
説明 |
|---|---|---|---|---|
|
1 |
INSERT INTO my_table(id) VALUE(1) |
開始 |
必要なチェックを実行して挿入を開始します。 |
|
1 |
INSERT INTO my_table(id) VALUE(1) |
終了 |
更新された |
|
1 |
DELETE FROM my_table |
開始 |
削除は、削除する記録のリストを識別子で指定します(id=1)。 |
|
2 |
INSERT INTO my_table(id) VALUE(2) |
開始 |
必要なチェックを実行して挿入を開始します。 |
|
2 |
INSERT INTO my_table(id) VALUE(2) |
終了 |
更新された |
|
2 |
SELECT * FROM my_table |
終了 |
スレッド |
|
1 |
DELETE FROM my_table |
終了 |
削除は、スレッド |
|
1 |
SELECT * FROM my_table BEFORE(STATEMENT => LAST_QUERY_ID()) |
終了 |
SELECT ステートメントは、Time Travelを使用して削除操作の完了前からの履歴データを取得します。結果には、スレッド |
回避策として、ステートメント開始直前の時点を指定する TIMESTAMP パラメーターを使用することができます。
使用上の注意¶
Snowflakeのデータは、システム時間の正確な値とわずかに異なる可能性があるタイムスタンプによって識別されます。
TIMESTAMP または OFFSET の値は定数式でなければなりません。
TIMESTAMP の最小時間解像度はミリ秒です。
要求されたデータがTime Travel保持期間(デフォルトは1日)を超えている場合、ステートメントは失敗します。
さらに、要求されたデータがTime Travel保持期間内であっても、履歴データが利用できない場合(保持期間が延長された場合など)、ステートメントは失敗します。
指定されたTime Travel時間がオブジェクトが作成された時点またはそれ以前の場合、ステートメントは失敗します。AT TIMESTAMP パラメーターの使用 をご参照ください。
履歴テーブルデータにアクセスすると、その結果にはテーブルの現在の定義に基づく列やデフォルト値などが含まれます。マテリアライズドビュー以外についても同様です。たとえば、テーブルを変更して列を追加した場合に、列が追加された時点より前の履歴データをクエリすると、新しい列を含む結果が返されます。
履歴データには、現在のデータと同じアクセス制御要件があります。変更は遡及的に適用されます。
AT および BEFORE 句は、 CTE からの履歴データの選択には対応していません。
たとえば、次のクエリはサポートされていません。
しかし、これらの句は、 WITH 句のクエリでサポートされています。たとえば、次のクエリはさぽーとされています。
ハイブリッドテーブルに対するTime Travelクエリには、以下の制限があります:
AT 句では、 TIMESTAMP パラメーターのみがサポートされます。OFFSET、 STATEMENT、 STREAM パラメーターはサポートされません。
TIMESTAMP パラメーターの値は、同じデータベースに属するすべてのテーブルで同じでなければなりません。テーブルが異なるデータベースに属している場合は、 TIMESTAMP の値が異なる場合があります。
BEFORE 句はサポートされません。
Time Travelを使用し、STATEMENT パラメーターで時間を指定する CREATE DATABASE ... CLONE および CREATE SCHEMA ... CLONE コマンドは、指定されたデータベースにハイブリッドテーブルが存在する場合、エラーを返します。このエラーは、 IGNORE HYBRID TABLES パラメーター を使用してコマンドを実行するように促します。このパラメーターを含めると、コマンドはクローンデータベースまたはスキーマを作成しますが、ハイブリッドテーブルはスキップします。
トラブルシューティング¶
エラー |
|
|---|---|
原因 |
場合によっては、これはタイムスタンプが期待される場所で文字列を使用することによって引き起こされます。 |
解決策 |
文字列をタイムスタンプにキャストします。 |
例¶
特定のタイムスタンプを使用して、テーブルから履歴データを選択します。TIMESTAMP パラメーターを使用する最初の2つの例では、 my_table は標準テーブルかハイブリッドテーブルになります。保持期間内の最近の日付、時刻、タイムスタンプを代入します。
5分前の時点でテーブルから履歴データを選択します。
テーブルから履歴データを選択しますが、指定したトランザクションによる変更は含まれません。
指定されたトランザクションから生じるテーブルデータの差を返します。
以下の例では、同じデータベース内の2つのテーブル(片方はハイブリッドテーブル)に対してTime Travel結合クエリを実行しています。両方のテーブルに同じ TIMESTAMP 式を使用する必要があります。保持期間内の最近の日付、時刻、タイムスタンプを代入します。