このトピックでは、LindormTable SQL でヒントを使用してデータ バージョン管理のタイムスタンプを設定する方法について説明します。
適用可能なエンジンとバージョン
ヒントは LindormTable 2.3.1 以降のバージョンにのみ適用されます。
LindormTable のバージョンを表示またはアップグレードする方法の詳細については、「LindormTable のリリースノート」および「Lindorm インスタンスのマイナー エンジン バージョンをアップグレードする」をご参照ください。
概要
LindormTable の各列に書き込まれるデータには、タイムスタンプが記録されます。 このタイムスタンプは、データが列に書き込まれたサーバー時間を示します。 デフォルトでは、タイムスタンプは、列に書き込まれたデータのバージョン ID として使用されます。 列に書き込むデータのタイムスタンプを指定することもできます。 タイムスタンプが大きいほど、バージョンが新しいことを示します。 LindormTable のワイドテーブル列の複数のバージョンを保存するには、テーブルの作成時に 'VERSIONS' = 'n' 属性を設定する必要があります。 この属性の n は、各列に保存できるバージョンの最大数を示す正の整数です。 LindormTable でタイムスタンプに基づいてバージョン管理されたデータをクエリするには、SQL 文で特定の属性を指定する必要があります。 次の表に、指定できる属性を示します。
属性 | 説明 | 該当する文 |
_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 パラメーターは保持するバージョンの数を示します。テーブルにデータを書き込みます。 次の文では、_l_ts_(N) 属性を指定してタイムスタンプを設定する必要があります。
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);タイムスタンプを使用して、指定されたバージョンのデータをクエリします。 結果にクエリ対象の列のタイムスタンプを表示するには、文の列名に
_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 個のバージョンをクエリします。 この例では、N の値は 1 に設定されています。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 | +----+----+---------+例 4: すべての列の最新の 2 つのバージョンをクエリし、同じタイムスタンプを持つ異なる列を同じ行に表示します。 文に
_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: 指定された列の最新の 6 つのバージョンをクエリします。 ただし、テストテーブルの VERSIONS 属性は、テーブルの作成時に 5 に設定されています。 そのため、文に
_l_versions_(6)属性が指定されていても、列の最新の 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 | +----+----+---------+