ヒストリーテーブルとタイムトラベルクエリー

(Based on 2.0 sps03)

 

HANAのヒストリーテーブル(History Tables)/タイムトラベルクエリー(Timetravel Query)は過去のある時点のデータを参照するための仕組み。

1つのカラムの値は、更新を履歴として記録するため複数のバージョンが存在し、過去のある時点の値へのアクセスを可能とする。内部的に、コミットIDをstart/fromの形式で保持することにより、そのバージョンが有効である時期がわかる。コミットIDは、コミットが発行された時間がUTCTIMESTAMPで管理されているため、タイムスタンプにより過去のある時点を指定可能。

 

手順(以下はHANA Studio SQL Consoleで実施)

  1. 作業用スキーマを作成し、カレントスキーマに。
    CREATE SCHEMA TRAVEL;
    SET SCHEMA TRAVEL;
  2. ヒストリーテーブルを作成
    CREATE HISTORY COLUMN TABLE x ( a INT, b INT ); 
  3. (1,1)を挿入し、COMMIT IDを取得。
    INSERT INTO x VALUES (1,1);
    COMMIT;
    SELECT last_commit_id FROM m_history_index_last_commit_id WHERE session_id = current_connection;
    f:id:huamutou:20190625110917p:plain
  4. (2,2)を挿入し、COMMIT IDを取得。
    INSERT INTO x VALUES (2,2);
    COMMIT;
    SELECT last_commit_id FROM m_history_index_last_commit_id WHERE session_id = current_connection; 
    f:id:huamutou:20190625111020p:plain
  5. 全ローを削除し、COMMIT IDを取得。
    DELETE FROM x;
    COMMIT;
    SELECT last_commit_id FROM m_history_index_last_commit_id WHERE session_id = current_connection;
    f:id:huamutou:20190625111136p:plain

以上でHistory Tablesへのクエリー準備は完了。
尚。上記例では明示的にCOMMIT;を実行したように書いてあるが、autocommit=onならば勿論不要(というか、暗黙的に実行される。)

 

クエリーレベルのタイムトラベルクエリー

*HANA Stdio>SQL Console>Property>Session>Auto Commit=Offは必要ありません。

  1. COMMIT ID指定によるタイムトラベルクエリー
    SELECT * FROM x AS OF COMMIT ID 371007;
    f:id:huamutou:20190625111524p:plain
    SELECT * FROM x AS OF COMMIT ID 371092;
    f:id:huamutou:20190625113022p:plain
    SELECT * FROM x AS OF COMMIT ID 371094; // return nothing
    f:id:huamutou:20190625111631p:plain
  2. 各COMMIT IDのタイムスタンプを取得。
    SELECT commit_time FROM sys.transaction_history WHERE commit_id = 371007;
    f:id:huamutou:20190625111953p:plain
    SELECT commit_time FROM sys.transaction_history WHERE commit_id = 371092;
    f:id:huamutou:20190625112024p:plain
    SELECT commit_time FROM sys.transaction_history WHERE commit_id = 371094;
    f:id:huamutou:20190625112053p:plain
  3. UTCTIMESTAMP指定によるタイムトラベルクエリー
    SELECT * FROM x AS OF UTCTIMESTAMP '2019-06-25 02:05:28.349';
    f:id:huamutou:20190625112727p:plain
    SELECT * FROM x AS OF UTCTIMESTAMP '2019-06-25 02:06:16';
    f:id:huamutou:20190625113022p:plain
    SELECT * FROM x AS OF UTCTIMESTAMP '2019-06-25 02:06:20';
    f:id:huamutou:20190625113105p:plain

 セッションレベルのタイムトラベルクエリー

  1. HANA Stdio>SQL Console>Property>Session>Auto Commit=Offが必要f:id:huamutou:20190625110249p:plain
    AutoCommit=Onの場合、後続のSET HISTORY SESSION文がエラーになり、

    f:id:huamutou:20190701171516p:plain
    結果、SELECT文は現在の(最新の)値を参照する。

  2. SET HISTORY SESSION TO COMMIT ID 371007;
    SELECT * FROM x;

    f:id:huamutou:20190701165115p:plain

  3.  

    SET HISTORY SESSION TO UTCTIMESTAMP '2019-06-25 02:06:16';
    SELECT * FROM x;
    f:id:huamutou:20190701165344p:plain

以上(2019/06/25)

2019/07/01改訂