識別列番号を生成するための処理 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 詳細トピック

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年6月
ft:locale
ja-JP
ft:lastEdition
2021-03-30
dita:mapPath
ja-JP/jpx1556733107962.ditamap
dita:ditavalPath
ja-JP/jpx1556733107962.ditaval
dita:id
B035-1184
Product Category
Software
Teradata Vantage

Teradata Databaseは、操作が単一行またはUSINGリクエスト修飾子に基づく挿入であるか、またはINSERT … SELECT操作であるかに応じて、異なる識別列番号を割り振ります。

挿入操作の種類 識別列番号のキャッシュの場所
  • 単一行
  • USING句

    この例は、BTEQインポートおよびTeradata Parallel Data PumpによるINSERT操作です。

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上で識別列の値を生成します。