• 検索結果がありません。

: ANSI Valid-Time 表を利用する

ドキュメント内 ANSIテンポラル表サポート (ページ 51-77)

有効時間 と は、 行内の情報が具体的な応用で有効ま たは真であ る 期間の こ と です。

(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 Databasevalid-time表を作成す る ために必要です。

[AS] VALIDTIME句を使用すれば、valid-time表のSELECT文で ANSIvalid-time表でサポー ト し ていない特別な テ ン ポ ラ ル修飾子 (AS OFBETWEEN ... ANDFROM ... TOCONTAINED 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 DatabaseANSIに対す る 拡張機能です。

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

列の値を除 く

)

は親表 の複数の行に存在す る こ と がで き ます。 こ の場合、 親表の対応す る 行が重複す る 連

続的な

valid-time

期間を含む必要があ り ます。

ドキュメント内 ANSIテンポラル表サポート (ページ 51-77)

関連したドキュメント