例: 非PTIテーブルからPTIテーブルを作成する
Create table src1( TD_TIMECODE TIMESTAMP(6) NOT NULL, C1 INTEGER, C2 INTEGER); CREATE TABLE pt71_tgt AS (SELECT * FROM src1) WITH DATA PRIMARY TIME INDEX (TIMESTAMP(6), DATE '2016-01-01', HOURS(1)); show table pt71_tgt; CREATE SET TABLE pt71_tgt, NO FALLBACK, NO BEFORE JOURNAL, NO AFTER JOURNAL, CHECKSUM = DEFAULT, DEFAULT MERGEBLOCKRATIO, MAP = TD_MAP1 ( TD_TIMEBUCKET BIGINT NOT NULL GENERATED SYSTEM TIMECOLUMN, TD_TIMECODE TIMESTAMP(6) NOT NULL GENERATED TIMECOLUMN, C1 INTEGER, C2 INTEGER) PRIMARY TIME INDEX (TIMESTAMP(6), DATE '2016-01-01', HOURS(1), NONSEQUENCED);
例: PTIテーブルをデータとともにコピーする
PTIテーブル定義と行データを新しいPTIテーブルにコピーするには、単純なCREATE TABLE AS文を使用します。
CREATE TABLE pt1_tgt AS pt1_src WITH DATA;生成された新しいPTIテーブル、pt1_tgtは、PTI定義と自動生成された列を含む、ソース テーブルpt1_srcの正確なコピーです。
例: 別のPTI定義を使用して、PTIテーブルを新しいPTIテーブルにコピーする
新しいPTIテーブルのPTI定義を変更するには、CREATE TABLE AS文にPRIMARY TIME INDEX句を含めます。
Create table pti_src ( C1 INTEGER, C2 INTEGER NOT NULL, C3 INTEGER) PRIMARY TIME INDEX (TIMESTAMP(6), DATE '2016-01-01', HOURS(1), columns(c1), SEQUENCED); -- Because the PTI includes a timebucket duration parameter, the table will include a TD_TIMEBUCKET column, -- but this column is invisible to SELECT queries and other DML. -- Because the PTI includes a SEQUENCED parameter, the table will include a TD_SEQNO column. SHOW TABLE pti_src; Create SET TABLE pti_src, NO FALLBACK, NO BEFORE JOURNAL, NO AFTER JOURNAL, CHECKSUM = DEFAULT, DEFAULT MERGEBLOCKRATIO, MAP = TD_MAP1 ( TD_TIMEBUCKET BIGINT NOT NULL GENERATED SYSTEM TIMECOLUMN, TD_TIMECODE TIMESTAMP(6) NOT NULL GENERATED TIMECOLUMN, TD_SEQNO INT NOT NULL GENERATED TIMECOLUMN, C1 INTEGER, C2 INTEGER NOT NULL, C3 INTEGER) PRIMARY TIME INDEX (TIMESTAMP(6), DATE '2016-01-01', HOURS(1), columns(c1), SEQUENCED(20000)); -- Assume the table has been populated with data. CREATE TABLE pti_tgt AS pti_src WITH DATA PRIMARY TIME INDEX (TIMESTAMP(6), DATE '2015-07-01', HOURS(1), NONSEQUENCED); SHOW TABLE pti_tgt; Create SET TABLE pti_tgt, NO FALLBACK, NO BEFORE JOURNAL, NO AFTER JOURNAL, CHECKSUM = DEFAULT, DEFAULT MERGEBLOCKRATIO, MAP = TD_MAP1 ( TD_TIMEBUCKET BIGINT NOT NULL GENERATED SYSTEM TIMECOLUMN, TD_TIMECODE TIMESTAMP(6) NOT NULL GENERATED TIMECOLUMN, TD_SEQNO INTEGER NOT NULL, C1 INTEGER, C2 INTEGER NOT NULL, C3 INTEGER) PRIMARY TIME INDEX (TIMESTAMP(6), DATE '2015-07-01', HOURS(1), NONSEQUENCED);
元のPTIテーブルと新しいPTIテーブルの間の次の違いに注意してください。
- ソース テーブルpti_srcには、COLUMNSオプションを含むPRIMARY TIME INDEX句があるため、ソース テーブルのPTIは、非表示のTD_TIMEBUCKET列とc1列の両方の値に基づいて、pti_srcからシステムAMPにデータを分散します。ただし、新しいテーブルpti_tgtのPRIMARY TIME INDEX句にはCOLUMNSオプションが含まれていないため、Primary Time Indexにはテーブルからのデータ列は含まれません。この新しいテーブルでは、データはTD_TIMEBUCKET列の値のみに基づいて、システムAMPに配布されます。
- 新しいPTIテーブルは、SEQUENCEDではなく、NONSEQUENCEDです。したがって、列属性GENERATED TIMECOLUMNは新しいPTIテーブルのTD_SEQNO列定義の一部ではなく、TD_SEQNOは通常の列として扱われます。
- 新しいテーブルのPTIには、ソース テーブルとは異なるtimezero_dateがあります。timezero_dateは、テーブルに格納されたデータに許可される最も早いタイムスタンプ日付を制限します。このCREATE TABLE … AS文にはWITH DATA句が含まれているため、pti_srcからのすべての行はpti_tgtに取り込まれます。これらの行のいずれかに、ターゲット テーブルに指定されたtimezero_dateより前のTD_TIMECODE(タイムスタンプ)値がある場合、Teradata Databaseはエラーを生成し、CREATE TABLE … AS文は失敗します。
例: PTIテーブルから非PTIテーブルを作成する
SHOW TABLE pti_src; Create SET TABLE pti_src, NO FALLBACK, NO BEFORE JOURNAL, NO AFTER JOURNAL, CHECKSUM = DEFAULT, DEFAULT MERGEBLOCKRATIO, MAP = TD_MAP1 ( TD_TIMEBUCKET BIGINT NOT NULL GENERATED SYSTEM TIMECOLUMN, TD_TIMECODE TIMESTAMP(6) NOT NULL GENERATED TIMECOLUMN, TD_SEQNO INT NOT NULL GENERATED TIMECOLUMN, C1 INTEGER, C2 INTEGER NOT NULL, C3 INTEGER) PRIMARY TIME INDEX (TIMESTAMP(6), DATE '2016-01-01', HOURS(1), columns(c1), SEQUENCED); CREATE TABLE reg1_tgt AS (SELECT * FROM pti_src) WITH DATA; show table reg1_tgt; CREATE SET TABLE reg1_tgt , NO FALLBACK , NO BEFORE JOURNAL, NO AFTER JOURNAL, CHECKSUM = DEFAULT, DEFAULT MERGEBLOCKRATIO, MAP = TD_MAP1 ( TD_TIMEBUCKET BIGINT, TD_TIMECODE TIMESTAMP(6), TD_SEQNO INTEGER, C1 INTEGER, C2 INTEGER, C3 INTEGER) PRIMARY INDEX ( TD_TIMEBUCKET );ただし、CREATE TABLE AS文に指定されているものが他にない場合、新しい非PTIテーブルのプライマリ インデックスは、最初に定義された列をテーブルに対して使用します。この場合、PTIソース テーブルにはtimebucket_durationパラメータ、HOURS(1)が含まれているため、ソース テーブルとターゲット テーブルの最初の列はTD_TIMEBUCKETになり、これが新しいテーブルのプライマリ インデックスとして使用されます。ソースPTIテーブルに最初の列としてTD_TIMEBUCKETがない場合、TD_TIMECODEが非PTIテーブルのプライマリ インデックスとして使用されます。PRIMARY INDEX句を明示的に指定すると、デフォルトの動作を上書きできます。