有効時間 と は、 行内の情報が具体的な応用で有効ま たは真であ る 期間の こ と です。
(ANSI
では、 こ の期間を 「アプ リ ケーシ ョ ン時間」 と いい ます。)
valid-time
列には、 保険証書や契約が有効であ る 期間、 従業員の雇用期間な ど、 時間を認識 し た手法での追跡や操作が重要にな る 情報を格納 し ます。
valid-time
表は、 表の行内の情報に期限が定め ら れていて、 時間を認識 し た手法で行の情報を保守、 追跡お よ び操作す る 必要のあ る 場合に使用 し て く だ さ い。
valid-time
表は、 行の変更頻度が比較的少ない場合に最適です。POS (
販売時点情報管理
)
表な ど、 非常に頻繁に変更 さ れ る 属性を表現す る には、valid-time
表 よ り も イ ベン ト 表の方が適 し てい ます。 イ ベン ト 表にはテ ン ポ ラ ル ・ セマ ン テ ィ ク ス を適用し ません。
注 : こ の章に記載 さ れてい る 資料には、
ANSI
テ ン ポ ラ ル表に適用 さ れ る 構文、ルール、 お よ びその他の詳細についての説明のみが含まれてい ます。 示 さ れてい る 構文図は、 テ ン ポ ラ ル構文に重点を置 く 全体図か ら 抜粋 し た図です。
こ こ で説明 し た従来の非テ ン ポ ラ ル ・ バージ ョ ンの
SQL
文に適用 さ れ る 既存の ルール と オプシ ョ ンのほ と ん どは、 テ ン ポ ラ ル文に も 適用 さ れます。 非テ ン ポ ラ ル ・ ルール と オプシ ョ ンについては、 こ こ では繰 り 返 し ません。 従来の非テ ン ポ ラ ルSQL DDL
お よ びDML
文の詳細は<SQLデー タ 定義言語> と <SQL デー タ 操作 言語> を参照 し て く だ さ い。ANSI Valid-Time表の作成
ANSI Valid-Time 表の作成
ANSI
では、valid-time
表を作成す る ための特別なCREATE TABLE
お よ びALTER
TABLE
構文 を サポー ト し て い ま す。 テ ン ポ ラ ル表の作成には次の操作が含 ま れます。
•
valid-time
期間の開始境界列 と 終了境界列の定義•
VALIDTIME
派生PERIOD
列の定義•
ANSI valid-time
表の基本キー、 固有制約、 および参照制約を定義する オプシ ョ ンの構文。
CREATE TABLE (ANSI Valid-Time 表フ ォ ーム )
目的
新 し い
ANSI valid-time
表を作成 し ます。構文規則
(
( , )
table_name CREATE MULTISET TABLE
valid_start
valid_start valid_time_period
DATE NOT NULL
A
A B
valid_end
valid_end WITH TIME ZONE
VALIDTIME B
) ,
,
PERIOD FOR C
C
; AS
TIMESTAMP
( precision )
DATE NOT NULL
WITH TIME ZONE TIMESTAMP
( precision )
構文要素 説明
table_name valid-time表の名前。 デー タ ベース修飾子を含む場合があ り ます。
valid_start valid-time期間の開始境界を保存す る 列の名前。
valid_end valid-time期間の終了境界を保存す る 列の名前。
precision タ イ ム ス タ ン プ値の精度です。 デフ ォ ル ト 値は6です。
valid_time_period valid-time派生PERIOD列の名前。
CREATE TABLE (ANSI Valid-Time表フ ォ ーム)
ANSIへの準拠
こ れは
ANSI SQL:2011
準拠ですが、ANSI
以外のTeradata Database
拡張機能を含み ます。[AS] VALIDTIME
はANSI
準拠ではあ り ませんが、Teradata Database
で定義 さ れ るvalid-time
表に含め る 必要があ り ます。使用上の注意
• 有効時間は、
ANSI
で 「アプ リ ケーシ ョ ン時間」 と 呼ばれてい る も ののTeradata
での実装です。• valid_start列 と
valid_end
列はNOT NULL
と し て定義す る 必要があ り ます。• valid_start列 と valid_end列のデー タ 型は一致 し ていなければな り ません。
• テ ン ポ ラ ル表 と し て機能す る には、
valid-time
表をAS VALIDTIME
と 定義す る 必 要があ り ます。System-time
表には、 有効時間はあ り ません。•
1
つの表は1
つのvalid-time
期間定義のみ持つ こ と がで き ます。•
valid-time
表は、 キ ュ ー、 エ ラ ー、 グ ロ ーバル一時 ト レース表にす る こ と はで き ません。•
valid-time
派生PERIOD
列で統計情報を収集す る こ と はで き ませんが、 構成要素の開始お よ び終了時間列で収集で き ます。
• アルゴ リ ズ ム圧縮
(ALC)
は、 テ ン ポ ラ ル派生PERIOD
列の開始お よ び終了境界 値の役割を果たすDateTime
列では使用で き ません。例: ANSI Valid-Time表の作成
次の例で、
valid-time
表を作成 し ます。CREATE MULTISET TABLE employee_valid_time ( eid INTEGER NOT NULL,
ename VARCHAR(5) 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 )
PRIMARY INDEX (eid);
[AS] VALIDTIME Teradata Databaseでvalid-time表を作成す る ために必要です。
[AS] VALIDTIME句を使用すれば、valid-time表のSELECT文で ANSIがvalid-time表でサポー ト し ていない特別な テ ン ポ ラ ル修飾子 (AS OF、BETWEEN ... AND、FROM ... TO、CONTAINED IN)を使用 で き ます。 詳細は、 「ANSI Valid-Time表への問合わせ」 (64ページ) を参照 し て く だ さ い。
注 : [AS] VALIDTIMEは、ANSIに対す るTeradata Databaseの拡張機 能です。
構文要素 説明
CREATE TABLE (ANSI Valid-Time表フ ォーム)
ANSI Valid-Time表の行パーテ ィ シ ョ ン化
問合わせのパフ ォーマ ン ス を高め る には、 テ ン ポ ラ ル表の行をパーテ ィ シ ョ ン化す る 必要があ り ます。 パーテ ィ シ ョ ン化に よ り 、 表の行を論理的に現在行 と 履歴行に グループ化 し ます。 現在行の問合わせは自動的に現在行を含むパーテ ィ シ ョ ンに向 け ら れます。
注 : テ ン ポ ラ ル表に列パーテ ィ シ ョ ン化を適用す る こ と も で き ますが、 こ こ で説明 す る 行パーテ ィ シ ョ ン化が、 テ ン ポ ラ ル表に使用 さ れ る パーテ ィ シ ョ ン化の タ イ プ の
1
つ と し て必ず構成 さ れ る 必要があ り ます。例: ANSI valid-time表の行パーテ ィ シ ョ ン化
valid-time
表を行パーテ ィ シ ョ ン化す る には、 次のPARTITION BY
句を使用 し ます。CREATE MULTISET TABLE employee_vt ( eid INTEGER NOT NULL,
ename VARCHAR(5) 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 ) PRIMARY INDEX(eid)
PARTITION BY CASE_N(
END(job_dur)>= CURRENT_DATE AT INTERVAL - 12:59' HOUR TO MINUTE, NO CASE);
注 : パーテ ィ シ ョ ン化式では、END(job_dur)の代わ り にjob_end を使用す る 場合 があ り ます。
現在パーテ ィ シ ョ ンの保守
時間の経過 と と も に現在行は履歴行にな る ので、
ALTER TABLE TO CURRENT
文を 定期的に使用 し て、 現在パーテ ィ シ ョ ンの履歴行を履歴パーテ ィ シ ョ ンに移動す る 必要があ り ます。ALTER TABLE TO CURRENT
ではパーテ ィ シ ョ ン式を再度解決 します。 こ れに よ り 、 各行は最新のパーテ ィ シ ョ ン式でそれぞれに適 し たパーテ ィ シ ョ ンに移動 さ れます。 例
:
ALTER TABLE temporal_table_name TO CURRENT;
こ の文では、 表に定義 さ れた基本キー と 固有性制約のために自動的に作成 さ れ る 、 シ ス テ ム定義の結合索引 も 更新 し ます。
ANSI Valid-Time表の基本キー と 固有性制約
ANSI Valid-Time 表の基本キー と 固有性制約
目的
Valid-time
表定義には、 基本キーお よ び行でvalid-time
期間が重な る こ と を防ぐ固有 性制約 を 含め る こ と がで き ま す。 シ ス テ ム定義の結合索引は、 表への変更中に制 約を確認す る ために自動的に作成 さ れます。構文規則
ANSIへの準拠
こ れは、
ANSI SQL:2011
に準拠 し てい ます。使用上の注意
• valid_time_period WITHOUT OVERLAPSが指定 さ れていない場合、 制約は非テ ン ポ ラ ル制約 と し て動作 し 、
valid-time
期間が重な る か ど う かに関係な く 値に固有 性を強制 し ます。• 表に
SYSTEM_TIME
派生PERIOD
列が含まれ る 場合、 派生PERIOD
列の開始およ び終了列はcolumn_listに含め る こ と はで き ません。
例: Valid-Time表のテ ンポ ラル基本キー制約 CREATE MULTISET TABLE employee_vt_pk ( eid INTEGER NOT NULL,
ename VARCHAR(5) 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, PRIMARY KEY(deptno, job_dur WITHOUT OVERLAPS)
)
PRIMARY INDEX (eid);
構文要素 説明
column_list 基本キーま たは表の固有性制約 と し て使用 さ れ る 列の名前ま た
は列のカ ン マ区切 り の リ ス ト 。 valid_time_period valid-time派生PERIOD列の名前。
WITHOUT
OVERLAPS 表の行のvalid-time期間が重な ら ない よ う に指定 し ます。
( )
, column_list
valid_time_period PRIMARY KEY
UNIQUE WITHOUT OVERLAPS
ANSI Valid-Time表のテ ン ポ ラ ル参照制約
ANSI Valid-Time 表のテ ンポ ラル参照制約
目的
テ ン ポ ラ ル参照制約では
2
つの表間の リ レーシ ョ ン シ ッ プ を定義 し ます。 こ の リ レーシ ョ ン シ ッ プでは、 外部キー(FK)
に属す るvalid-time
列が含まれていて、 子表 の1
つま たは複数の制約列(FK)
に含まれ る 各値が、 親表のそれに対応す る 参照列(
基本キー(PK))
に存在す る 必要があ り ます。 し たがっ て、 子表の各行のvalid-time
値は、 親表内にvalid-time
値 と し て存在 し てい る 必要があ り ます。こ れ ら の制約は
Teradata Database
では適用 さ れないため、 「 ソ フ ト 参照整合性」 と 呼ばれ る こ と が あ り ま す。 こ の よ う な制約は強制 さ れてい ま せんが、 最適化ルー チンは冗長な結合を排除 し 、 問合わせのパフ ォーマ ン ス を向上す る ために、 それ ら の制約を使用 し ます。注 : こ の よ う な制約に違反し ない こ と を確認する のは、 ユーザーの責任にな り ます。
テ ン ポ ラ ル参照制約は、 特殊な
PERIOD
キーワ ー ド を使用 し てvalid-time
派生PERIOD
列の名前を指定す る こ と に よ り 、 テ ン ポ ラ ル表のvalid-time
派生列に対 し て定義す る こ と がで き ます。構文規則
( , )
FOREIGN KEY fk_column_list PERIOD REFERENCES WITH NO CHECK OPTION table_name
A fk_valid_time_period
( pk_column_list , PERIOD pk_valid_time_period ) A
構文要素 説明
fk_column_list 子表の外部キー と し て使用 さ れ る 列の名前ま たは列のカ ン マ区切
り の リ ス ト 。 こ れ ら の列は、 pk_column_listを参照 し 、 こ れに対 応 し ます。fk_column_list列の各値は、pk_column_listの対応す る 列に存在す る 必要があ り ます。
fk_valid_time_period 子表のvalid-time派生PERIOD列の名前。
REFERENCES WITH
NO CHECK OPTION こ の関係が参照制約であ り 、 デー タ ベース に よ っ て強制 さ れない よ う に指定 し ます。
WITH NO CHECK OPTIONは、Teradata DatabaseのANSIに対す る 拡張機能です。
table_name 外部キーに よ っ て参照 さ れ る 表の名前。
pk_column_list 親表の基本キー と し て使用 さ れ る 列の名前ま たは列のカ ン マ区切
り の リ ス ト 。
pk_valid_time_period 親表のvalid-time派生PERIOD列の名前。
ANSI Valid-Time表のテ ン ポ ラ ル参照制約
ANSI
への準拠こ れは、
ANSI SQL:2011
規格に対す るTeradata
拡張機能です。使用上の注意
• こ れは、
valid-time
列間の関係で あ る ため、PK-FK
テ ン ポ ラ ル参照制約内の参 照す る 表 と 参照 さ れ る 表はvalid-time
表ま たは二重テ ン ポ ラ ル表にな り ま す。表の タ イ プが一致す る 必要はあ り ません。 二重テ ン ポ ラ ル表の詳細については、
第5章: 「ANSI二重テ ン ポ ラ ル表を利用す る 」 を参照 し て く だ さ い。
例: ANSI 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, PRIMARY KEY(h_eid, hire_period WITHOUT OVERLAPS)
)
PRIMARY INDEX(h_eid);
CREATE MULTISET TABLE employee_vt_ri ( eid INTEGER NOT NULL,
ename VARCHAR(5) 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),
FOREIGN KEY(eid,PERIOD job_dur) REFERENCES WITH NO CHECK OPTION hire_contracts(h_eid, PERIOD hire_period)
)
PRIMARY INDEX (eid);
テ ンポ ラル関係制約
テ ン ポ ラ ル関係制約
(TRC)
と は、valid-time
列を含ま ない子表 と 、valid-time
列を含 む親表 と の表間に定義す る 参照 リ レーシ ョ ン シ ッ プの こ と です。 子表のFK
には、親表の
PK
のvalid-time
列を参照す るTRC
列 と い う 列を含む必要があ り ます。 子表 のTRC
列の値は、valid-time
表の対応す る 行のvalid-time
列に よ っ て定義 さ れ る 期 間内に存在 し なければな ら ないため、 制約 さ れてい ます。TRC
を作成す る ために、 特別なテ ン ポ ラ ル構文や修飾子は必要あ り ません。 その他 の タ イ プの ソ フ ト 参照制約を作成す る ために使用 さ れ る 標準のREFERENCES WITH NO CHECK OPTION
を使用 し て く だ さ い。 相違点は、TRC
の場合、 子表にvalid-time
列を含め る こ と がで き ない こ と と 、 親表にvalid-time
列を含め る 必要がある こ と です。
親表は
valid-time
のテ ン ポ ラ ル表であ る ため、 子表FK (TRC
列の値を除 く)
は親表 の複数の行に存在す る こ と がで き ます。 こ の場合、 親表の対応す る 行が重複す る 連続的な