分割不能Upsertの使用ルール - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ操作言語

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

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

制約 説明
アップサート操作の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 トランザクション