ヒント20/20:時間内の任意のポイントを照会


今日では、トランザクションを使用してスナップショットをシミュレートする方法を示しますbSQL . マルチバージョンプロトコルのため、ユーザーは、設定されたクエリ時間でクエリを実行することによって、古いデータにアクセスできます.クエリ時間を設定することによって、以降のクエリはすべて実行されたかのように実行されます.これは、豊富なデータの洞察力を与え、データベースの古いバージョンの分析を可能にします.次の図は、伝統的なデータベースのスナップショットを示し、クエリ時間を設定しますblockpoint's 不変のデータベース.


構文
SET TRANSACTION 
    QUERY TIME <query_time>

<query_time> ::=
    timestamp
    | STATE
QUERY TIME指定した時刻にスナップショットのような環境で実行するクエリを設定します.値AMENDED or DISCONTINUED 指定された時間が復元され、リレーショナルエンティティが保持される保証されます.

[!NOTE]
The query time is currently specified in UTC time format.



クエリがシステムの現在の状態で正常に動作することを指定します.
  • 制限

  • LIFETIME queries and QUERY TIME は互いに排他的である.ライフタイムクエリが他のバージョンで実行されている場合、エラーがスローされますSTATE .
  • 以前のデータベースのバージョンで実行されるクエリは常にREAD UNCOMMITTED アイソレーションレベル.
  • タイムスタンプ
    読む時間.Timestampは、引用符のタイムスタンプとして、または有効なタイムスタンプに計算する式として指定することができます.

    クエリ時間の設定
    私たちはQUERY TIME キーワードを指定した時刻のスナップショットをシミュレートします.システムが継続的に変更を追跡するので、トランザクション時間はパフォーマンスにわずかな影響しかないはずです.下のすべての声明は技術的にコミットされましたが、我々はまだ前の州を見ることができます.
    CREATE BLOCKCHAIN users TRADITIONAL (id UINT64 AUTO INCREMENT PRIMARY, name STRING PACKED);
    
    INSERT users (name) VALUES ("john"), ("jimmy"), ("jeff");
    
    --Assume Time = "2021-02-26 00:07:10.000000000"
    
    DISCONTINUE users (id, name) VALUES (1, "jimmy");
    
    SET TRANSACTION QUERY TIME "2021-02-26 00:07:10.000000000";
    
    SELECT * FROM users;
    

    出力
    「ジミー」が指定された取引時間の前にブロックチェーンに挿入されたので.レコードはデータベースのその状態に保持されます.
    ID
    名称
    0
    ジョン
    1
    ジミー
    2
    ジェフ

    結論
    この例は些細なものですが、監査とデータ分析のために同じ論理が使用されます.それは時間をかけてデータの進化にユーザーのアクセスを与えるためにユニークな方法でデータベース構造を使用します.