このトピックでは、LindormTable SQL のヒントを使用してデータバージョニングのタイムスタンプを設定する方法について説明します。
サポートされるエンジンとバージョン
このヒント構文は、LindormTable エンジンバージョン 2.3.1 以降でのみ使用できます。
現在のバージョンを確認またはアップグレードする方法については、「LindormTable のリリースノート」および「マイナーバージョンのアップグレード」をご参照ください。
仕組み
LindormTable では、各列の値は書き込み時にタイムスタンプを受け取ります。デフォルトでは、このタイムスタンプは書き込み操作のサーバー時間であり、列のバージョン識別子として機能します。タイムスタンプが大きいほど、新しいバージョンを示します。カスタムタイムスタンプを指定することもできます。ワイドカラムテーブルに複数バージョンのデータを格納する場合は、テーブルの作成時にバージョン属性 'VERSIONS' = 'n' を設定する必要があります。ここで、n は各列で保持するバージョンの最大数です。複数バージョンのデータをクエリするには、クエリで適切なヒントを指定する必要があります。次の表に、データバージョニングで使用されるヒントを示します。
ヒント | 説明 | 適用可能な文 |
_l_ts_(N) | 指定されたタイムスタンプでデータを読み書きします。 | UPSERT、SELECT |
_l_versions_(N) | 結果セット内で最新の N 個のバージョンのデータを返します。 | SELECT |
_l_ts_min_(N) | 結果セットをフィルタリングし、タイムスタンプが N 以上のデータを返します。 | SELECT |
_l_ts_max_(N) | 結果セットをフィルタリングし、タイムスタンプが N 未満のデータを返します。 | SELECT |
操作手順
タイムスタンプの設定とデータのクエリ
LindormTable では、プライマリキー以外の列にタイムスタンプを設定し、そのタイムスタンプを使用して特定のデータバージョンをクエリできます。
テストテーブルを作成し、保持するバージョン数を指定します。
CREATE TABLE t_test_versions_2 (c1 INT , c2 INT, c3 VARCHAR(50), PRIMARY KEY(c1)) WITH(VERSIONS='5');説明ALTER TABLE table_name SET 'VERSIONS' = 'num';文を実行して、テーブルのバージョン数を指定または変更できます。ここで、table_name はテーブル名、num はバージョン数です。タイムスタンプを設定するには、適切なヒントを指定する必要があります。例:
UPSERT /*+ _l_ts_(1000) */ INTO t_test_versions_2(c1, c3) values (1, '11'); UPSERT /*+ _l_ts_(2001) */ INTO t_test_versions_2(c1, c3) values (1, '22'); UPSERT /*+ _l_ts_(1000) */ INTO t_test_versions_2(c1, c2) values (1, 1); UPSERT /*+ _l_ts_(2001) */ INTO t_test_versions_2(c1, c2) values (2, 1); UPSERT /*+ _l_ts_(2002) */ INTO t_test_versions_2(c1, c2) values (2, 2); UPSERT /*+ _l_ts_(2003) */ INTO t_test_versions_2(c1, c2) values (2, 3); UPSERT /*+ _l_ts_(2004) */ INTO t_test_versions_2(c1, c2) values (2, 4); UPSERT /*+ _l_ts_(2005) */INTO t_test_versions_2(c1, c2) values (2, 5); UPSERT /*+ _l_ts_(2006) */ INTO t_test_versions_2(c1, c2) values (2, 6);タイムスタンプを使用して特定のデータバージョンをクエリします。列のタイムスタンプを表示するには、クエリでその列と拡張列を指定する必要があります。拡張列の名前は、
column_name_l_tsという形式に従います。例えば、列
c3のタイムスタンプを表示するには、SELECT文にc3とc3_l_tsの両方を含める必要があります。重要バージョン情報をクエリする際に、バージョン関連のヒントを含めずに拡張列 (例:'c3_l_ts') を選択した場合、結果セットの拡張列は
nullを返します。したがって、クエリ文には/*+ _l_versions_(1) */や/*+ _l_ts_min_(N) */のようなバージョン関連のヒントも含める必要があります。例 1:タイムスタンプ 1000 のデータを返します。
SELECT /*+ _l_ts_(1000) */ c1, c3, c3_l_ts FROM t_test_versions_2 WHERE c1 = 1;次の結果が返されます。
+----+----+---------+ | c1 | c3 | c3_l_ts | +----+----+---------+ | 1 | 11 | 1000 | +----+----+---------+例 2:タイムスタンプが
[1000,2001)の範囲にあるデータをクエリします。SELECT /*+ _l_ts_min_(1000), _l_ts_max_(2001) */ c1, c3, c3_l_ts FROM t_test_versions_2 WHERE c1 = 1;次の結果が返されます。
+----+----+---------+ | c1 | c3 | c3_l_ts | +----+----+---------+ | 1 | 11 | 1000 | +----+----+---------+例 3:
_l_versions_(N)ヒントを使用して、最新の N 個のバージョンのデータを返します。SELECT /*+ _l_versions_(1) */ c1, c3, c3_l_ts FROM t_test_versions_2 WHERE c1 = 1;次の結果が返されます。
+----+----+---------+ | c1 | c3 | c3_l_ts | +----+----+---------+ | 1 | 22 | 2001 | +----+----+---------+各列の最新 2 バージョンを返します。同じタイムスタンプを持つバージョンは 1 つの行にグループ化されます。
_l_versions_(N)ヒントは、すべてのプライマリキー以外の列のタイムスタンプデータを取得します。SELECT /*+ _l_versions_(2) */ c1, c2, c3, c2_l_ts, c3_l_ts FROM t_test_versions_2;次の結果が返されます。
+----+------+------+---------+---------+ | c1 | c2 | c3 | c2_l_ts | c3_l_ts | +----+------+------+---------+---------+ | 1 | null | 22 | null | 2001 | | 1 | 1 | 11 | 1000 | 1000 | | 2 | 6 | null | 2006 | null | | 2 | 5 | null | 2005 | null | +----+------+------+---------+---------+例 5:返されるバージョン数は、テーブルの 'VERSIONS' 属性によって上限が設定されます。例えば、このクエリは
_l_versions_(6)で 6 つのバージョンをリクエストしていますが、テーブルが 'VERSIONS'='5' で作成されているため、5 つしか返されません。SELECT /*+ _l_versions_(6) */ c1, c2, c2_l_ts FROM t_test_versions_2 WHERE c1=2;次の結果が返されます。
+----+----+---------+ | c1 | c2 | c2_l_ts | +----+----+---------+ | 2 | 6 | 2006 | | 2 | 5 | 2005 | | 2 | 4 | 2004 | | 2 | 3 | 2003 | | 2 | 2 | 2002 | +----+----+---------+