16.20 - 分割不能Upsertの使用ルール - Teradata Database - Teradata Vantage NewSQL Engine

Teradata Vantage™ SQLデータ操作言語

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Release Date
2019年3月
Content Type
プログラミング リファレンス
Publication ID
B035-1146-162K-JPN
Language
日本語 (日本)

以下のテーブルに、分割不能アップサート操作に関する基本的な制約について説明します。

制約 説明
アップサート操作のUPDATEとINSERTコンポーネントは、同じテーブルを指定しなければなりません。 分割不能アップサートの目的は、まずテーブル内の特定の行の更新を試みてから、その行が見つからなければ、テーブルにその行を挿入することにあります。

文のUPDATEとINSERTコンポーネントに別々のテーブルを指定すると、この操作の目的は損なわれます。

テーブルにはプライマリ インデックスが必要で、行パーティション化できますが、列パーティション化できません。 プライマリ インデックスは、行の検索に必要です。
アップサート操作のUPDATEとINSERTコンポーネントは、同じ行を指定しなければなりません。

すなわち、挿入される行のプライマリ インデックス値は、更新のターゲット行のプライマリ インデックス値と同じであるということです。

アップサート操作では、そのターゲットのいずれかの行を見つけることができないと、更新するはずであった行を挿入します。そのために、テーブル内に行が存在していたら更新されたはずのフィールドに特定の「更新」値を挿入します。

この制約事項が満たされるのは、UPDATEコンポーネントのWHERE句で指定されたプライマリ インデックス値が、INSERTコンポーネントに指定された列値に暗に示されたプライマリ インデックス値に一致した場合です。

INSERT用に識別列に生成される数値は事前に分からないので、識別列がプライマリ インデックスであるターゲット テーブルへのアップサート操作は実行できません。

識別列がプライマリ インデックスではない識別列テーブルへのアップサートは有効です。

どのアクセスも必ず1 AMP操作になるよう、UPDATEコンポーネントはプライマリ インデックス値を完全指定します。 文のUPDATEコンポーネントがプライマリ インデックスを完全指定すれば、システムは単一のAMPハッシュ操作でどのターゲット行にでもアクセスすることができます。

Teradata Parallel Data Pumpの場合にはこのルールは限られた範囲で適用されます。つまり、単純な制約値(定数か、またはインポート後のデータ フィールドに対するUSING句の参照)を使った等価性制約としてUPDATEコンポーネントのWHERE句内にプライマリ インデックスが指定されるという意味と解釈されます。インデックス以外の列に関してとSET句内の更新値に関する制約にも単純値がとられます。それによって、コストのかかるsubqueryやFROM句の参照を避けることができます。同様に、INSERT内でsubqueryを使わなくて済むよう、パフォーマンス駆動の先頭演算子がTpumpには備えられています。

Upsert UPDATEを行パーティション テーブルに対して実行するとき、以下のルールに従っていなければ、エラーが戻されます。
  • パーティション列の値は、文のUPDATE句のWHERE句に指定しなければなりません。
  • 文のINSERT句は、UPDATE句の場合と同じ区分を指定しなければなりません。
  • UPDATE句はパーティション列を変更できません。

ゼロ除算エラーのなどのパーティション式評価エラーの結果は、セッション モードに依存します。

セッション モード 式評価エラーがロールバックする作業単位
ANSI リクエスト
Teradata トランザクション