ヒストリーテーブルとタイムトラベルクエリー
(Based on 2.0 sps03)
HANAのヒストリーテーブル(History Tables)/タイムトラベルクエリー(Timetravel Query)は過去のある時点のデータを参照するための仕組み。
1つのカラムの値は、更新を履歴として記録するため複数のバージョンが存在し、過去のある時点の値へのアクセスを可能とする。内部的に、コミットIDをstart/fromの形式で保持することにより、そのバージョンが有効である時期がわかる。コミットIDは、コミットが発行された時間がUTCTIMESTAMPで管理されているため、タイムスタンプにより過去のある時点を指定可能。
手順(以下はHANA Studio SQL Consoleで実施)
- 作業用スキーマを作成し、カレントスキーマに。
CREATE SCHEMA TRAVEL;
SET SCHEMA TRAVEL; - ヒストリーテーブルを作成
CREATE HISTORY COLUMN TABLE x ( a INT, b INT ); - (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; - (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; - 全ローを削除し、COMMIT IDを取得。
DELETE FROM x;
COMMIT;
SELECT last_commit_id FROM m_history_index_last_commit_id WHERE session_id = current_connection;
以上でHistory Tablesへのクエリー準備は完了。
尚。上記例では明示的にCOMMIT;を実行したように書いてあるが、autocommit=onならば勿論不要(というか、暗黙的に実行される。)
クエリーレベルのタイムトラベルクエリー
*HANA Stdio>SQL Console>Property>Session>Auto Commit=Offは必要ありません。
- COMMIT ID指定によるタイムトラベルクエリー
SELECT * FROM x AS OF COMMIT ID 371007;
SELECT * FROM x AS OF COMMIT ID 371092;
SELECT * FROM x AS OF COMMIT ID 371094; // return nothing - 各COMMIT IDのタイムスタンプを取得。
SELECT commit_time FROM sys.transaction_history WHERE commit_id = 371007;
SELECT commit_time FROM sys.transaction_history WHERE commit_id = 371092;
SELECT commit_time FROM sys.transaction_history WHERE commit_id = 371094; - UTCTIMESTAMP指定によるタイムトラベルクエリー
SELECT * FROM x AS OF UTCTIMESTAMP '2019-06-25 02:05:28.349';
SELECT * FROM x AS OF UTCTIMESTAMP '2019-06-25 02:06:16';
SELECT * FROM x AS OF UTCTIMESTAMP '2019-06-25 02:06:20';
セッションレベルのタイムトラベルクエリー
- HANA Stdio>SQL Console>Property>Session>Auto Commit=Offが必要
AutoCommit=Onの場合、後続のSET HISTORY SESSION文がエラーになり、
結果、SELECT文は現在の(最新の)値を参照する。 - SET HISTORY SESSION TO COMMIT ID 371007;
SELECT * FROM x;
-
SET HISTORY SESSION TO UTCTIMESTAMP '2019-06-25 02:06:16';
SELECT * FROM x;
以上(2019/06/25)
2019/07/01改訂