以下のテーブルに、分割不能アップサート操作に関する基本的な制約について説明します。
制約 | 説明 |
---|---|
アップサート操作の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 | トランザクション |