使用上の注意 - Atomic Upsert - Parallel Data Pump

Teradata® Parallel Data Pump リファレンス

Product
Parallel Data Pump
Release Number
17.00
Published
2020年6月
Language
日本語
Last Update
2021-01-07
dita:mapPath
ja-JP/ioq1544831946920.ditamap
dita:ditavalPath
ja-JP/ioq1544831946920.ditaval
dita:id
B035-3021
Product Category
Teradata Tools and Utilities

Atomic UPSERTの構文は、UPDATE文とINSERT文から構成されます。各文は、以下のようにELSEキーワードで区切ります。

UPDATE <update-operands> ELSE INSERT <insert-operands>;

Teradata TPumpではUPDATE文とINSERT文の間にELSEキーワードが自動的に挿入されるため、スクリプトに手動で入力する必要はありません。ELSEキーワードがスクリプトに手動で入力された場合、Teradata TPumpは構文エラーを出力して停止します。

<update-operands>は標準のUPDATE SQL文のオペランド、<insert-operands>は標準のINSERT SQL文のオペランドです。Atomic UPSERT文では、特定のUPDATEオペランドとINSERTオペランドしか有効にならないため、指定されたUPSERT文の内部にあるoperandパラメータは、updateパラメータとinsertパラメータのリンクに関する制約を受けます。

Teradata TPumpスクリプト内にある他のDMLについても当てはまることですが、標準のUPSERT機能を使用する場合は常に、UPDATE文に基本索引を完全に指定する必要があります。指定が完全であれば、全AMP操作ではなく単一AMP操作で更新の処理を行なうことができます。それに加え、UPSERT文をペアで構成するUPDATEおよびINSERTの両方に同一のターゲット テーブルを指定したうえで、UPDATEのWHERE句に指定する基本索引値を、INSERTの列値で示される基本索引値と一致させる必要があります。Atomic UPSERT文の処理時にこれらの基本的なUPSERT制約を満たさない文があると、多くの場合、データベースはその文を拒否してエラーを返します。これによって、Teradata TPumpでの制約違反の検出および処理が可能になっています。

UPSERT操作の基本的制約として考慮すべきものを次に示します。
  • SAME TABLE:UPDATE文とINSERT文には、同じテーブルを指定しなければなりません。
  • SAME ROW: UPDATE文とINSERT文には、同じ行を指定しなければなりません。INSERT行にある基本索引の値は、処理対象のUPDATE行にある基本索引の値と一致させる必要があります。
  • HASHED ROW ACCESS: 処理対象の行へのアクセスを単一AMPのハッシュ操作で行なえるようにするには、UPDATEに基本索引を完全に指定しなければなりません。
  • これらの制約の一部には、UPDATE文およびINSERT文で別々にサポートされている構文に関係するものもあります。しかし、Atomic UPSERT文の中で組み合わせて使用した場合は例外です。Atomic UPSERT機能でサポートされていない制約(データベースに送信したときにエラーが返されるもの)を次に示します。
  • INSERT... SELECT: 構文はサポートされていません。挿入値のいずれかを指定するための副問合わせが、INSERTに使用されていない可能性があります。この構文がサポートされた場合、上述したUPDATEのWHERE句制約の副問合わせに対するサポートにつながることが見込まれ、新しい構文機能の追加によってUPDATEおよびINSERTから同じ副問合わせへの参照の効率化が可能になることに注意してください。
  • UPDATE- WHERE - CURRENT: 構文はサポートされていません。WHERE句では、いわゆる位置指定によるUPDATEを実行する際に、更新可能なカーソルを使用することはできません。(この構文がサポートの対象となる見込みはほとんどありません。) この制約があっても、他の方法を用いればAtomic UPSERT文と一緒にカーソルを使用できることに注意してください。例えば、UPSERT文をDECLARE CURSOR文の中に含めて、カーソルを開いたときに実行されるようにできます(そうしなければUPSERTが有効にならない場合)。
  • UPDATE- FROM: サポートされていません。SET句では、カラムの値を更新する式の中にFROM句によるテーブル参照を使用することはできません。
  • UPDATE- WHERE SUBQUERIES: サポートされていません。基本索引を指定する副問合わせ、または索引以外のカラムを制約する副問合わせを、WHERE句に使用することはできません。このUPDATE構文をサポートする場合は、UPDATEと同じ基本索引値を指定するためのINSERT … SELECTまたはそれ以外のINSERT構文機能もサポートする必要があることに留意してください。
  • UPDATE- PRIMARY INDEX: サポートされていません。UPDATEでは、基本索引の変更はできません。この更新は、不当な更新と呼ばれる場合もあります。
  • TRIGGERS: UPDATEまたはINSERTのどちらかによってトリガーが有効化される場合、機能はサポートされません。この制約は、UPDATEおよびINSERTの両方が実行された場合にも同様に適用されます。構文解析プログラムのトリガー ロジックは、トリガーの条件付き実行を試みるものではないからです。UPDATEでは、UPDATE句で参照されない列にトリガーが送られます。しかし、UPSERTでは有効化されないため許可されています。DELETEトリガーもUPSERTで有効化されることはないため、同様に許可されています。UPSERTをトリガー アクションとして使用することも可能ですが、その場合は他のUPSERTと同様の制約を受ける恐れがあるので注意してください。UPSERTは自身ではトリガーを有効化できないため、これ以上のカスケード式トリガー アクションをUPSERTトリガー アクションによって生成することは許可されません。
  • JOIN/HASH INDEXES:UPDATEまたはINSERTのどちらかによって結合/ハッシュ索引が更新された場合、機能はサポートされません。トリガーの場合と同様で、UPDATEとINSERTの両方を実行したときと同じように、各UPSERTに制約が適用されます。更新された列を結合/ハッシュ索引が参照しない場合、UPDATEではこの制約を免れることができます。しかし、INSERTがこの制約を免れることのできる見込みはほとんどありません(不可能な場合もあります)。極めて稀な結合/ハッシュ索引の例を2~3挙げて制約を解除するメリットを示したときに、導入費用に見合う価値がないことが判明した場合は、関連する結合/ハッシュ索引を持ったテーブルに対して制約をさらに広範に適用する必要があります。

Teradata TPumpは、制約が失敗した場合、致命的でないエラーとして扱い、診断目的としてエラーをジョブ ログ内でレポートした後、UPSERTプロトコルを元の非基本的なものに戻してジョブを続行します。

Teradata TPumpでは、順序に依存する問題が解決されるように、常にUPDATEの処理を終えた後にINSERTを処理します。これは、次の理由によるものです。

  • UPSERT名(UP[date]+[in]SERT)で示された順序と一致させるため。
  • UPDATE-ELSE-INSERT構文で示された順序と一致させるため。
  • UPSERTの一般的な意味の定義と一致させるため。
  • MULTISETテーブルに対するUPSERT操作において、挿入第一の方針が常にUPDATEではなくINSERTで正常終了することを考慮に入れるため。

既存のTeradata TPumpスクリプトをUPSERTに合わせて変更する必要はありません。下記のUPSERT構文は、引き続きサポートされます。

DO INSERT FOR MISSING UPDATE ROWS;
UPDATE <update-operands>;
INSERT <insert-operands>;

Teradata TPumpは、UPDATE文とINSERT文の間にあるセミコロンをELSEキーワードで置き換え、文のペアを1つのAtomic UPSERT文に変換して、この構文をAtomic UPSERT構文に変更します。

Teradata TPumpでは、UPDATE文およびINSERT文の代わりにユーザー作成マクロが使用された場合、次のものが生成されます。

EXEC <update-macro> ELSE EXEC <insert-macro>;

この文はAtomic UPSERT構文に従っていないため、Teradata TPumpでは代替の構文が使用されます。