行パーティションvalid-timeテーブルへのマージ - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - テンポラル テーブル サポート

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年6月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/cjo1556732840654.ditamap
dita:ditavalPath
ja-JP/cjo1556732840654.ditaval
dita:id
B035-1182
Product Category
Software
Teradata Vantage

すべてのMERGE文で、ON句の照合条件に、ターゲット テーブルのプライマリ インデックスに対する等号制約を指定する必要があります。(プライマリ インデックスを持たないテーブルと列パーティション テーブルでは、MERGEはサポートされていないことに注意してください。)ターゲット テーブルが行パーティション化されていると、向上した最適化が得られるANSI MERGEパスを対象とするには、単一のパーティションが対象となるように、パーティション列も等号条件に含める必要があります。ANSI MERGE最適化パスについての詳細は、<Teradata Vantage™ - SQLデータ操作言語、B035-1146>を参照してください。

テンポラル テーブルに推奨されるパーティション式ではテンポラル列の期間のEND境界のみを使用するため、照合条件でも同様に等号制約でEND条件が使用できます。END (valid_time_column) IS UNTIL_CHANGEDおよびEND (transaction_time_column) IS UNTIL_CLOSEDは、推奨されるパーティション式を使用するテンポラル テーブルのテンポラル列に等号制約として使用できます(テンポラル テーブルのパーティション式を参照)。

ターゲット行のvalid-timeの終了境界値が、前もって判明していることはほとんどありません。解決策は、USING句に同じ条件を使用してソース テーブルとターゲット テーブルを事前結合することです。これにより、ターゲット テーブルのvalid-time値を特定します。

事前結合には、NONSEQUENCED VALIDTIME修飾子を(適用できる場合には、AND CURRENT TRANSACTIONTIMEも)使用する必要があります。事前結合はソースからの左外部結合にして、一致しない行セットがターゲット テーブルに挿入されることを防止する必要があります。

例: 行パーティション化されたvalid-timeテーブルへのマージ

次の例では、マージに非テンポラルのソース テーブルを使用します。挿入される値は、あらゆる値になり得ますが、別々のパーティションに移動することになります。

CREATE MULTISET TABLE bi_tgt_tbl
     (
      pkey_field INTEGER,
      int2_field INTEGER,
      vtcol PERIOD(DATE) NOT NULL AS VALIDTIME,
      ttcol PERIOD(TIMESTAMP(6) WITH TIME ZONE) NOT NULL 
            AS TRANSACTIONTIME)
PRIMARY INDEX ( pkey_field )
PARTITION BY CASE_N(
((END(vtcol)) >= DATE ) AND ((END(ttcol)) >= CURRENT_TIMESTAMP(6)),
((END(vtcol)) <  DATE ) AND ((END(ttcol)) >= CURRENT_TIMESTAMP(6)),
(END(ttcol )) < CURRENT_TIMESTAMP(6));

CREATE SET TABLE src_tbl
     (
      pkey_field INTEGER,
      int2_field INTEGER)
PRIMARY INDEX ( pkey_field );

SEQUENCED VALIDTIME
MERGE INTO bi_Tgt_tbl
USING   /* This block prejoins and determines the target valid time
           values */
(
  NONSEQUENCED VALIDTIME PERIOD (DATE'2009-12-15', DATE'2009-12-18')
  AND CURRENT TRANSACTIONTIME
  SELECT  s.pkey_field, s.int2_field, END(b_t.vtcol) vtend,           END(b_t.ttcol) ttend
  FROM 	src_tbl s LEFT OUTER JOIN bi_tgt_tbl b_t
  ON s.pkey_field = b_t.pkey_field
) AS nonbi_srct ( pkey, int2, vtend, ttend)
ON (pkey_field = nonbi_srct.pkey) 
AND END(vtcol) = vtend 
AND END(ttcol) = ttend

WHEN MATCHED THEN
 UPDATE SET int2_field = nonbi_srct.int2
WHEN NOT MATCHED THEN
 INSERT ( nonbi_srct.pkey, nonbi_srct.int2, 
          PERIOD(TEMPORAL_DATE, UNTIL_CHANGED )
);