Teradata Databaseは、操作が単一行またはUSINGリクエスト修飾子に基づく挿入であるか、またはINSERT … SELECT操作であるかに応じて、異なる識別列番号を割り振ります。
挿入操作の種類 | 識別列番号のキャッシュの場所 |
---|---|
|
PE。 |
INSERT … SELECT | AMP。 |
Teradata Databaseでは、識別列番号を生成するためのバッチ番号スキーマを使用します。バルク挿入の行の初期バッチがPEまたはAMPに到着するとき、システムは、行の処理を開始する前に番号の範囲を予約します。それぞれのPEまたはAMPは、ディクショナリ テーブルDBC.IdColから識別列のために次の使用可能な値を取得し、即時にDBS制御レコード内のIdCol Batch Sizeパラメータの設定値分だけ値を増やします。
番号の範囲が予約されると、システムは、vprocローカル識別列キャッシュ内の範囲にある最初の番号を格納します。同じ識別列テーブル上に並行挿入を行なっている別のタスクは、挿入されるそれぞれの行ごとに1つの番号を割り振り、キャッシュ内でその番号を増加させます。最後の予約番号が発行されると、PEまたはAMPは、別の範囲の番号を予約し、DBC.IdCol内にあるこの識別列の登録項を更新します。
このプロセスを考えると、以下の明白な番号の異常の原因がよくわかります。
- Teradataのアーキテクチャは、非常に並列的であるため、生成された識別列番号は、必ずしも行が挿入される順序を反映しません。
- 順序番号のギャップが生じる可能性があります。キャッシュされる予約済み番号の範囲は、システムの再始動にまたがって保持されないため、正確な増分を保証できません。たとえば、1というINCREMENT BY値を持つテーブルに挿入される1,000行の識別列値は、識別列番号プールが使い果たされる前にシステムの再始動が行なわれる場合、1~1,000まで番号付けされないことがあります。
識別列のINSERT操作に関する以下の特性により、行の識別番号が、宛先のAMPに配布される前にPE上で生成されるか、または配布された後に宛先のAMP上で生成されるかが決まります。
- テーブルのプライマリ インデックスにもなっており、かつGENERATED ALWAYSと定義された識別列に値を挿入する場合、Teradata DatabaseはAMPに対して行をハッシュ生成する前にPE上で識別列の値を生成します。
- テーブルのプライマリ インデックスではない識別列に値を挿入する場合、Teradata Databaseは行の宛先AMP上で識別列の値を生成します。