シ ス テ ム時間 と 有効時間 を 単一表に統合 し て、 両方の機能 を 使用す る こ と がで き ま す。
•
system-time
次元を表に追加す る と 、 表に対す る すべての変更を追跡 し 、 表自体に行の永久的かつ持続的な履歴を残す こ と がで き ます。
• 表に
valid-time
次元を追加す る と 、 各行に含 ま れ る 情報の有効日に影響す る 変更を表に対 し て行な っ た と き に、
valid-time
期間デー タ を自動的に調整す る こ と がで き ます。シ ス テ ム時間 と 有効時間は独立 し た次元であ る ため、 二重テ ン ポ ラ ル表に加え た変 更はそれぞれの次元に個別に影響を与え ます。 表に対す る 影響は、 第3章: 「ANSI System-Time表を利用す る 」 お よ び第4章: 「ANSI Valid-Time表を利用す る 」 で、
system-time
表お よ びvalid-time
表に対 し て個別に示 さ れてい る 効果が組み合わ さ れ た も のにな り ます。ANSI二重テ ン ポ ラ ル表の作成
ANSI 二重テ ン ポ ラ ル表の作成
二重テ ン ポ ラ ル表には
system-time
お よ びvalid-time
次元が含 ま れてい ま す。 二重 テ ン ポ ラ ル表を作成す る ための構文は、SYSTEM_TIME
お よ びvalid-time
の派生PERIOD
列を作成す る ための構文を組み合わせた も のです。CREATE TABLE (ANSI 二重テ ンポ ラル表形式 )
目的
新 し い
ANSI
二重テ ン ポ ラ ル表を作成 し ます。構文規則
二重テ ン ポ ラ ル表を作成す る ための特別なテ ン ポ ラ ル構文はあ り ません。「CREATE TABLE (ANSI System-Time 表フ ォーム)」 (28ページ)お よ び 「CREATE TABLE (ANSI Valid-Time表フ ォーム )」 (52ページ)に示 さ れた形式を単に組み合わせた も のにな り ます。 二重テ ン ポ ラ ル表では、
system-time
表お よ びvalid-time
表の両方に 該当す る ルール、 制限、 お よ び使用上の注意 も 組み合わ さ れ る こ と に ご注意 く ださ い。
例えば、 二重テ ン ポ ラ ル表を
CREATE TABLE ... AS
文の ソ ース表に使用 し た り 、 二 重テ ン ポ ラ ル表の派生PERIOD
列で統計を収集 し た り す る こ と はで き ません。注 : 第3章: 「ANSI System-Time表を利用す る 」 お よ び第4章: 「ANSI Valid-Time 表を利用す る 」 に示 さ れた
system-time
お よ びvalid-time
列に関す る すべての制限 は、 二重テ ン ポ ラ ル表に も 適用 さ れます。例: ANSI二重テ ンポ ラル表の作成
次に、
ANSI
二重テ ン ポ ラ ル表を作成す る 例を示 し ます。CREATE MULTISET TABLE employee_bitemporal ( eid INTEGER NOT NULL,
ename VARCHAR(5), deptno INTEGER NOT NULL, terms VARCHAR(5),
job_start DATE NOT NULL, job_end DATE NOT NULL,
PERIOD FOR job_dur(job_start,job_end) AS VALIDTIME, sys_start TIMESTAMP(6) WITH TIME ZONE NOT NULL
GENERATED ALWAYS AS ROW START, sys_end TIMESTAMP(6) WITH TIME ZONE NOT NULL
GENERATED ALWAYS AS ROW END, PERIOD FOR SYSTEM_TIME(sys_start,sys_end) )
PRIMARY INDEX (eid) WITH SYSTEM VERSIONING;
CREATE TABLE (ANSI二重テ ン ポ ラ ル表形式)
ANSI二重テ ンポ ラル表の行パーテ ィ シ ョ ン化
問合わせのパフ ォーマ ン ス を高め る には、 テ ン ポ ラ ル表の行をパーテ ィ シ ョ ン化す る 必要があ り ます。 パーテ ィ シ ョ ン化す る と 、 表の行を現在行、 履歴行、 オープン 行、 お よ び ク ロ ーズ行に論理的にグループ化で き ます。 二重テ ン ポ ラ ル表の場合、
現在行 と オープン行に対す る 問合わせは、 こ れ ら の行を含むパーテ ィ シ ョ ンに自動 的に送信 さ れます。
注 : テ ン ポ ラ ル表に列パーテ ィ シ ョ ン化を適用す る こ と も で き ますが、 こ こ で説明 す る 行パーテ ィ シ ョ ン化が、 テ ン ポ ラ ル表に使用 さ れ る パーテ ィ シ ョ ン化の タ イ プ の
1
つ と し て必ず構成 さ れ る 必要があ り ます。例: ANSI valid-time表の行パーテ ィ シ ョ ン化
valid-time
表を行パーテ ィ シ ョ ン化す る には、 次のPARTITION BY
句を使用 し ます。CREATE MULTISET TABLE employee_bitemp ( eid INTEGER NOT NULL,
ename VARCHAR(5), deptno INTEGER NOT NULL, terms VARCHAR(5),
job_start DATE NOT NULL, job_end DATE NOT NULL,
PERIOD FOR job_dur (job_start,job_end) AS VALIDTIME, sys_start TIMESTAMP(6) WITH TIME ZONE NOT NULL
GENERATED ALWAYS AS ROW START, sys_end TIMESTAMP(6) WITH TIME ZONE NOT NULL
GENERATED ALWAYS AS ROW END, PERIOD FOR SYSTEM_TIME(sys_start,sys_end) ) PRIMARY INDEX (eid)
PARTITION BY CASE_N(
(END(job_dur) >= CURRENT_DATE AT INTERVAL -'12:59' HOUR TO MINUTE) AND END(SYSTEM_TIME) >= CURRENT_TIMESTAMP,
END(job_dur) < CURRENT_DATE AT INTERVAL -'12:59' HOUR TO MINUTE AND END(SYSTEM_TIME) >= CURRENT_TIMESTAMP,
END(SYSTEM_TIME) < CURRENT_TIMESTAMP )WITH SYSTEM VERSIONING;
注
• パーテ ィ シ ョ ン式にはEND(SYSTEM_TIME)の代わ り にsys_end、END(job_dur) の代わ り にjob_end を使用で き ます。
•
WITH SYSTEM VERSIONING
はCREATE TABLE
文の最後の句 と し て使用す る 必要があ り ます。現在パーテ ィ シ ョ ンの保守
時間の経過 と と も に現在行は履歴行にな る ので、
ALTER TABLE TO CURRENT
文を 定期的に使用 し て、 現在パーテ ィ シ ョ ンの履歴行を履歴パーテ ィ シ ョ ンに移動す る 必要があ り ます。ALTER TABLE TO CURRENT
ではパーテ ィ シ ョ ン式を再度解決 します。 こ れに よ り 、 各行は最新のパーテ ィ シ ョ ン式でそれぞれに適 し たパーテ ィ シ ョ ンに移動 さ れます。 例
:
ALTER TABLE temporal_table_name TO CURRENT;
こ の文では、 表に定義 さ れた基本キー と 固有性制約のために自動的に作成 さ れ る 、 シ ス テ ム定義の結合索引 も 更新 し ます。
ANSI二重テ ン ポ ラ ル表の基本キーお よ び固有性制約
ANSI 二重テ ンポ ラル表の基本キーおよび固有性制約
目的
二重テ ン ポ ラ ル表の定義 も
valid-time
表の定義 と 同様に、 基本キーお よ び固有性制 約を含めて、 行のvalid-time
期間が重な ら ない よ う にす る こ と がで き ます。構文規則
二重テ ン ポ ラ ル表に基本キーま たは固有性制約を追加す る ための構文は、 「ANSI Valid-Time表の基本キー と 固有性制約」 (55ページ)に示 さ れた
valid-time
表で使用さ れてい る 構文 と 同 じ です。
使用上の注意
• 基本キーま たは固有性制約を構成す る 列に
system-time
派生PERIOD
列を含め る こ と はで き ません。• 制約は
system-time
次元内のオープン な行にのみ適用 さ れます。例: ANSI二重テ ンポ ラル表のテ ンポ ラル基本キー制約 CREATE MULTISET TABLE employee_bitemp_pk ( eid INTEGER NOT NULL,
ename VARCHAR(5) NOT NULL, deptno INTEGER NOT NULL, terms VARCHAR(5),
job_start DATE NOT NULL, job_end DATE NOT NULL,
PERIOD FOR job_dur(job_start,job_end) AS VALIDTIME, sys_start TIMESTAMP(6) WITH TIME ZONE NOT NULL
GENERATED ALWAYS AS ROW START, sys_end TIMESTAMP(6) WITH TIME ZONE NOT NULL
GENERATED ALWAYS AS ROW END, PERIOD FOR SYSTEM_TIME(sys_start,sys_end)
PRIMARY KEY(deptno,job_dur WITHOUT OVERLAPS) )
PRIMARY INDEX (eid) WITH SYSTEM VERSIONING;
ANSI二重テ ン ポ ラ ル表のテ ン ポ ラ ル参照制約
ANSI 二重テ ンポ ラル表のテ ンポ ラル参照制約
目的
テ ン ポ ラ ル参照制約では
2
つの表間の リ レーシ ョ ン シ ッ プ を定義 し ます。 こ の リ レーシ ョ ン シ ッ プでは、 外部キー(FK)
に属す るvalid-time
列が含まれていて、 子表 の1
つま たは複数の制約列(FK)
に含まれ る 各値が、 親表のそれに対応す る 参照列(
基本キー(PK))
に存在す る 必要があ り ます。 し たがっ て、 子表の各行のvalid-time
値は、 親表内にvalid-time
値 と し て存在 し てい る 必要があ り ます。こ れ ら の制約は
Teradata Database
では適用 さ れないため、 「 ソ フ ト 参照整合性」 と 呼ばれ る こ と が あ り ま す。 こ の よ う な制約は強制 さ れてい ま せんが、 最適化ルー チンは冗長な結合を排除 し 、 問合わせのパフ ォーマ ン ス を向上す る ために、 それ ら の制約を使用 し ます。注 : こ の よ う な制約に違反し ない こ と を確認する のは、 ユーザーの責任にな り ます。
テ ン ポ ラ ル参照制約は、 特殊な
PERIOD
キーワ ー ド を使用 し てvalid-time
派生PERIOD
列の名前を指定す る こ と に よ り 、 テ ン ポ ラ ル表のvalid-time
派生列に対 し て定義す る こ と がで き ます。構文規則
二重テ ン ポ ラ ル表にテ ン ポ ラ ル参照制約を追加す る ための構文は、 「ANSI Valid-Time表のテ ン ポ ラ ル参照制約」 (56ページ)に示 さ れた
valid-time
表で使用 さ れて い る 構文 と 同 じ です。ANSI
への準拠こ れは、
ANSI SQL:2011
に準拠 し てい ます。使用上の注意
•
system-time
派生PERIOD
列を参照元の列ま たは参照先の列の リ ス ト に含め る こと はで き ません。
•
PK-FK
制約はsystem-time
次元内のオープン な行にのみ適用 さ れます。• こ れは
valid-time
列間の リ レーシ ョ ン シ ッ プであ る ため、PK-FK
テ ン ポ ラ ル参照 制約 リ レーシ ョ ン シ ッ プ内の参照元の表 と 参照先の表にはvalid-time
表ま たは二 重テ ン ポ ラ ル表のいずれかを使用で き ます。 表の タ イ プが一致す る 必要はあ りません。
例: valid-time表のテ ンポ ラル参照制約 CREATE MULTISET TABLE hire_contracts(
h_eid INTEGER NOT NULL, h_name VARCHAR(5) NOT NULL, h_terms VARCHAR(5),
contract_start DATE NOT NULL, contract_end DATE NOT NULL,
PERIOD FOR hire_period(contract_start,contract_end) AS VALIDTIME,
ANSI二重テ ン ポ ラ ル表のテ ン ポ ラ ル参照制約
PRIMARY KEY(h_eid, hire_period WITHOUT OVERLAPS) )
PRIMARY INDEX(h_eid);
CREATE MULTISET TABLE employee_bitemporal_ri ( eid INTEGER NOT NULL,
ename VARCHAR(5) NOT NULL, deptno INTEGER NOT NULL, terms VARCHAR(5),
job_start DATE NOT NULL, job_end DATE NOT NULL,
PERIOD FOR job_dur(job_start,job_end) AS VALIDTIME, UNIQUE(eid,job_dur WITHOUT OVERLAPS),
sys_start TIMESTAMP(6) WITH TIME ZONE NOT NULL GENERATED ALWAYS AS ROW START,
sys_end TIMESTAMP(6) WITH TIME ZONE NOT NULL GENERATED ALWAYS AS ROW END,
PERIOD FOR SYSTEM_TIME(sys_start,sys_end),
FOREIGN KEY(eid,PERIOD job_dur) REFERENCES WITH NO CHECK OPTION hire_contracts(h_eid, PERIOD hire_period)
)
PRIMARY INDEX (eid) WITH SYSTEM VERSIONING;
ALTER TABLE (ANSI二重テ ン ポ ラ ル表形式)
ALTER TABLE (ANSI 二重テ ンポ ラル表形式 )
目的
ALTER TABLE
のテ ン ポ ラ ル構文を使用す る と 、 既存の非テ ン ポ ラ ル表か らANSI
二重テ ン ポ ラ ル表を作成 し 、system-time
表お よ びvalid-time
表のALTER TABLE
構 文を組み合わせ る こ と がで き ます。表に有効時間を追加す る 操作には、 次に示す
ALTER TABLE
操作が含まれます。•
valid-time
期間の開始境界お よ び終了境界 と し て使用 さ れ る2
つのDateTime
列を 追加ま たは変更す る•
valid-time
派生PERIOD
列を表に追加 し て、 派生列VALIDTIME
を指定す る 表にシ ス テム時間を追加する操作には、 次に示すALTER TABLE
操作が含まれます。•
system-time
期間の開始境界お よ び終了境界 と し て使用 さ れ る 列を指定 し て、SYSTEM_TIME
派生PERIOD
列を表に追加す る•
system-time
期間の開始境界お よ び終了境界 と し て使用 さ れ る 列を追加ま たは変更す る 。 こ れ ら の列が表内にすでに存在す る 場合は、 特殊な属性を追加す る 必 要があ り ます
• 表にシ ス テ ムのバージ ョ ン情報を追加す る
構文規則
表を二重テ ン ポ ラ ル表に変更す る ための特殊な構文はあ り ません。 「ALTER TABLE (ANSI System-Time表フ ォーム)」 (31ページ)お よ び 「ALTER TABLE (ANSI Valid-Time表フ ォーム)」 (60ページ)に記載 さ れてい る 特殊構文を組み合わせて使用 し て く だ さ い。
注 :
system-time
次元を追加す る 前に、 表を変更 し てvalid-time
次元を追加す る 必要 があ り ます。system-time
表に対す るALTER TABLE
操作は厳 し く 制限 さ れてい る た めです。例: ALTER TABLEによ る非テ ンポ ラル表からANSI二重テ ンポ ラル表への変換 次の
SQL
文は通常の非テ ン ポ ラ ル表を作成 し 、 行をい く つか挿入 し ます。CREATE MULTISET TABLE employee_bitemp ( eid INTEGER NOT NULL,
ename VARCHAR(5), deptno INTEGER NOT NULL, terms VARCHAR(5),
job_start DATE NOT NULL, job_end DATE NOT NULL,
sys_start TIMESTAMP(6) WITH TIME ZONE NOT NULL, sys_end TIMESTAMP(6) WITH TIME ZONE NOT NULL )
PRIMARY INDEX (eid);
ALTER TABLE (ANSI二重テ ン ポ ラ ル表形式)
INSERT INTO employee_bitemp VALUES
(1001,'Sania',111,'TW08',DATE'2002-01-01',DATE'2006-12-31', TIMESTAMP'2002-01-01 00:00:00.000000-08:00',
TIMESTAMP'2002-07-01 12:00:00.350000+00:00');
INSERT INTO employee_bitemp VALUES
(1004,'Fred',222,'PW12', DATE'2001-05-01',DATE'9999-12-31', TIMESTAMP'2001-05-01 12:00:00.350000-08:00',
TIMESTAMP'9999-12-31 23:59:59.999999+00:00');
INSERT INTO employee_bitemp VALUES
(1002,'Ash',333,'TA05',DATE'2003-01-01',DATE'2003-12-31', TIMESTAMP'2003-01-01 12:11:00.000000-08:00',
TIMESTAMP'9999-12-31 23:59:59.999999+00:00');
INSERT INTO employee_bitemp VALUES
(1003,'SRK',111,'TM02',DATE'2004-02-10',DATE'2005-02-10', TIMESTAMP'2004-02-10 00:00:00.000000-08:00',
TIMESTAMP'2004-12-01 00:12:23.120000+00:00');
INSERT INTO employee_bitemp VALUES
(1005,'Alice',222,'TW10',DATE'2004-12-01',DATE'9999-12-31', TIMESTAMP'2004-12-01 12:00:00.450000-08:00',
TIMESTAMP'9999-12-31 23:59:59.999999+00:00');
INSERT INTO employee_bitemp VALUES
(1010,'Mike',444,'TW07',DATE'2015-01-01',DATE'2016-12-31', TIMESTAMP'2004-12-01 00:12:23.120000-08:00',
TIMESTAMP'9999-12-31 23:59:59.999999+00:00');
テンポラル表サポート
行が挿入 さ れた後に、 修飾 さ れていないSELECT を表に実行す る と 、 すべての行が返 さ れます。
SELECT * FROM employee_bitemp;
eid ename deptno terms job_start job_end sys_start sys_end
---- --- --- --- --- --- --- ---1002 Ash 333 TA05 2003/01/01 2003/12/31 2003-01-01 12:11:00.000000-08:00 9999-12-31 23:59:59.999999+00:00 1005 Alice 222 TW10 2004/12/01 9999/12/31 2004-12-01 12:00:00.450000-08:00 9999-12-31 23:59:59.999999+00:00 1010 Mike 444 TW07 2015/01/01 2016/12/31 2004-12-01 00:12:23.120000-08:00 9999-12-31 23:59:59.999999+00:00 1001 Sania 111 TW08 2002/01/01 2006/12/31 2002-01-01 00:00:00.000000-08:00 2002-07-01 12:00:00.350000+00:00 1004 Fred 222 PW12 2001/05/01 9999/12/31 2001-05-01 12:00:00.350000-08:00 9999-12-31 23:59:59.999999+00:00 1003 SRK 111 TM02 2004/02/10 2005/02/10 2004-02-10 00:00:00.000000-08:00 2004-12-01 00:12:23.120000+00:00
次のALTER TABLE文は表に有効時間を追加 し ます。
ALTER TABLE employee_bitemp
ADD PERIOD FOR job_dur(job_start,job_end) AS VALIDTIME;
表か ら 単に選択 し た場合は、 任意のvalid-time表か ら 選択す る 場合 と 同様に、 すべての行が返 さ れます。
SELECT * FROM employee_bitemp;
eid ename deptno terms job_start job_end sys_start sys_end
---- --- --- --- --- --- --- ---1002 Ash 333 TA05 2003/01/01 2003/12/31 2003-01-01 12:11:00.000000-08:00 9999-12-31 23:59:59.999999+00:00 1005 Alice 222 TW10 2004/12/01 9999/12/31 2004-12-01 12:00:00.450000-08:00 9999-12-31 23:59:59.999999+00:00 1010 Mike 444 TW07 2015/01/01 2016/12/31 2004-12-01 00:12:23.120000-08:00 9999-12-31 23:59:59.999999+00:00 1001 Sania 111 TW08 2002/01/01 2006/12/31 2002-01-01 00:00:00.000000-08:00 2002-07-01 12:00:00.350000+00:00 1004 Fred 222 PW12 2001/05/01 9999/12/31 2001-05-01 12:00:00.350000-08:00 9999-12-31 23:59:59.999999+00:00 1003 SRK 111 TM02 2004/02/10 2005/02/10 2004-02-10 00:00:00.000000-08:00 2004-12-01 00:12:23.120000+00:00
次のALTER TABLE文は表にシ ス テ ム時間を追加 し ます。
ALTER TABLE employee_bitemp
ADD PERIOD FOR SYSTEM_TIME(sys_start,sys_end)
ADD sys_start TIMESTAMP(6) WITH TIME ZONE NOT NULL GENERATED ALWAYS AS ROW START
ADD sys_end TIMESTAMP(6) WITH TIME ZONE NOT NULL GENERATED ALWAYS AS ROW END;
ALTER TABLE employee_bitemp ADD SYSTEM VERSIONING;
表にsystem-time次元が追加 さ れたため、sys_endの日付が9999-12-31 23:59:59.999999+0:0でない行は ク ロ ーズ行 と みな さ れ、 デー タ ベース か ら 論理的に削除 さ れます。 し たが っ て、 表を単に選択 し た場合は、 4行のみ表示 さ れます。