17.00 - 17.05 - ロード分離 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLリクエストおよびトランザクション処理

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Published
2020年6月
Content Type
プログラミング リファレンス
ユーザー ガイド
Publication ID
B035-1142-170K-JPN
Language
日本語 (日本)

Teradataは、テーブル分離プロパティを提供します。これにより、テーブルにデータがロードされている最中でも、テーブルからコミット済みの行を読み取ることができます。テーブルがロードされている最中でデータが変更されていても、ロード分離では、最新のコミット済みデータが確実に取得されます。

CREATE/ALTER TABLEリクエストのWITH CONCURRENT ISOLATED LOADINGオプションを使用して、テーブルをロード分離として定義することができます。ロード分離テーブルは、最新のコミット済みロードID値をデータ ディクショナリに記録します。ロード分離テーブルでの読み取り操作では、最新のコミット済みロードIDを使用して、コミット済みの行を、まだコミットしていないものから分離します。詳細については、<Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144>を参照してください。

同時実行セッションでコミット済み読み取りを有効にするために、変更される行は論理的にロード分離テーブルから削除され、行が更新されるときに変更済みの値を持つ新しい行が挿入されます。行がまだコミットしていない場合は、読み取られたデータが、後続のデータ変更の前にテーブルでtrueかつ最終だったデータということになります。インデックス ベースの同時実行読み取りを有効にするために、インデックス(結合インデックスを含む)も行のコミット プロパティを維持します。結合インデックス テーブルは、参照基本テーブルのいずれかがロード分離テーブルである場合に、ロード分離テーブルとしてマークが付けられます。

LOAD COMMITTEDロッキング修飾子を使用して、ロード分離の変更をブロックすることなく、ロード分離テーブルのコミット済みの行を読み取ることができます。

詳細については、<Teradata Vantage™ - SQLデータ操作言語、B035-1146>を参照してください。

ロード分離テーブルでの変更は、同時実行または非同時実行のいずれかに分類されます。同時実行ロード分離変更(CLDI)は、同時実行読み取りセッションでロード コミット済み行の選択を許可する変更です。非同時実行ロード分離変更(NCLDI)は、読み取り側セッションでコミット済みの行の選択をブロックする変更です。SQLを使用して実行されるNCLDI変更は、WRITEではなく、EXCLUSIVEロックを使用します。FastloadやMultiloadなどのユーティリティを使用して実行されるNCLDI変更、またはMLOADXを使用せずにTPTまたはTPT Updateオペレータを使用するロード オペレータは、EXCLUSIVEロックまたはWRITEロックを使用することがあります。ユーティリティ ベースのロード操作中に取得されたWRITEロックは、ロード分離ターゲット テーブルでEXCLUSIVEに格上げされることがありますが、そうすると、同時読み取りセッションがACCESSロックを使用して実行されている場合でも、ブロックされる場合があります。

ロード操作は、トランザクションで暗黙的に開始されます。ロード操作は、トランザクションがコミットされた時点でコミットされます。このトランザクションを実行しているセッションは、ロード セッションです。

ロード分離テーブルのロード処理

ロード分離テーブルの場合、ロード操作は単一トランザクションに制限されます。

ロード操作中に変更されるすべての行は、ロード非コミット行とみなされ、テーブルはロード操作がコミットされるまでロード状態にあるとみなされます。

テーブルで実行した、最初にコミットされたロード分離DML SQLは、ロード分離テーブルでのロードを開始します。テーブルはロード用にマークされ、セッションとトランザクションの両方に関連付けられます。トランザクションがコミットするときに、ロード操作がコミットされます。トランザクションがロールバックされると、ロード操作もロールバックされます。

ロード分離テーブルの基になる結合インデックスが変更された場合は、結合インデックスもロード中としてマークされます。トランザクションのコミットの一部として、そのようなテーブルは次のようなアクションでロード コミットされます。
  • ロード中のテーブルのDBC.TVM行は、対応するCurrentLoadIDプロパティ値を使用して増分1で更新されます。
  • トランザクション コミットのコミット ステップ処理中、次のようなイベントが実行されます。
    • テーブルのテーブル ヘッダー行が更新され、ロードの完了がマークされます。
    • ロード分離廃棄ステップがTVMおよびロード分離テーブルのテーブル ヘッダー用に生成され、ディクショナリ キャッシュが更新されたCurrentLoadID値で更新されます。

暗黙的トランザクション ベース ロード分離ロードのロード状態パラメータ

ロードが暗黙的トランザクション ベース ロードの場合には、次のロード状態情報が、ロード分離テーブルのテーブル ヘッダーに記録されます。
  • ロードを実行しているセッションの論理ホストIDとセッション番号。
  • ロード操作に使用されるNewLoadID値。

LOCKING FOR LOAD COMMITTEDリクエスト修飾子

LOCKINGリクエスト修飾子は、システムがデータベース、テーブル、ビュー、行ハッシュに掛けるデフォルトのロックの上書きをユーザーに許可します。ユーザーがロード分離テーブルを読み取る場合は、LOAD COMMITTEDロックを使用することができます。

LOAD COMMITTEDロック モードは、新しいタイプのロックではありません。この句のロック マネージャで表示または報告されるロックは、既存のACCESSロックです。

LOAD COMMITTEDロック モードでは、NULL SQLを使用して指定した場合、または参照オブジェクトがSQLリクエストで使用されていない場合に、システムでACCESSロックが掛かります。非ロード分離テーブルでLOAD COMMITTEDロックを指定すると、このアクションでもシステムがACCESSロックを適用することになります。

LOAD COMMITTEDロック モードの動作は、ACCESSロックのロック動作と同様です。主な違いは、テーブルがSQLリクエストで参照される場合にロード分離テーブルから選択するデータにあります。
  • テーブルがロード分離テーブルで、セッションでロードされていない場合は、ロード コミット済みデータがテーブルから返されます。これは、読み取られているテーブルにシステムがロード コミット済み条件を適用したことを示しています。
  • テーブルがロード分離テーブルで、セッションでロードされている場合は、非コミット データもテーブルから返されます。これは、読み取られているテーブルにロード非コミット条件をシステムが適用したことを示しています。

ロックが格上げできない場合、ロッキング修飾子は無視されます。LOAD COMMITTEDロック モードを定義するビューのLOCKING FOR ACCESS修飾子は無視されます。

次のテーブルは、テーブルのトランザクション分離レベルに指定される明示的LOCKING修飾子がある場合とない場合の動作を説明しています。セッション分離レベルがSERIALIZABLEである場合、ロード分離テーブルでの読み取り操作では、同時書き込み操作がブロックされます。ロード分離テーブルの推奨メソッドは、セッションが同時書き込みをブロックせずにテーブルからロード コミット済み行を選択できるように、LOAD COMMITTEDロッキング修飾子を指定することです。

分離レベル ロッキング修飾子 DBS制御フィールド54設定

(AccessLockForUncomRead)

変更文の読み取りテーブル ソース 読み取りテーブル非変更文
SERIALIZABLE 指定しない場合 適用なし READ

ロード コミット済み条件

READ

ロード コミット済み条件

SERIALIZABLE アクセスのsrcをロック 適用なし ACCESS

ロード非コミット条件

ACCESS

ロード非コミット条件

SERIALIZABLE ロード コミット済みのsrcをロック 適用なし ACCESS

ロード コミット済み条件

ACCESS

ロード コミット済み条件

READ UNCOMMITTED 指定しない場合 FALSE(デフォルト) READ

ロード コミット済み条件

ACCESS

ロード非コミット条件

READ UNCOMMITTED ロード コミット済みのsrcをロック 適用なし ACCESS

ロード非コミット条件

ACCESS

ロード非コミット条件

READ UNCOMMITTED 指定しない場合 TRUE ACCESS

ロード非コミット条件

ACCESS

ロード非コミット条件

READ UNCOMMITTED ロード コミット済みのsrcをロック 適用なし ACCESS

ロード コミット済み条件

ACCESS

ロード コミット済み条件

READ UNCOMMITTED 読み取りのsrcをロック 適用なし READ

ロード コミット済み条件

READ

ロード コミット済み条件

LOCKING LOAD COMMITTEDリクエスト修飾子の詳細については、<Teradata Vantage™ - SQLデータ操作言語、B035-1146>を参照してください。

ロード分離テーブルの変更

WITH CONCURRENT ISOLATED LOADINGまたはWITH NO CONCURRENT ISOLATED LOADING構文を持つロード分離テーブルでは、INSERT、UPDATE、MERGE、およびDELETE文を使用できます。WITH NO CONCURRENT ISOLATED LOADINGを指定する場合、変更は、非同時実行ロード分離変更(NCLDI)として実行されます。

CLDI変更は、同時実行ロード コミット済みベース読み取り操作から分離されたロード分離テーブルでの変更です。変更は、変更または削除された行のバージョンを保存することによって変更を分離している間に実行されます。

NCLDI変更は、同時読み取り操作を許可しないロード分離テーブルでの変更です。これは、同等の非ロード分離テーブルに使用されるのと同じ変更メソッドに従いますが、取得されるロックがEXCLUSIVEロックで、同時読み取り操作はブロックされます。

明示的にWITH CONCURRENT ISOLATED LOADINGを使用する場合、SQL操作はCLDIで、ロード操作として扱われます。これはFOR NO ISOLATED LOADINGのセッション設定を上書きする場合に役立ちます。

ロード操作を無効にするセッション内のすべてのDML文は、デフォルトのNCLDI変更になります。

次のテーブルは、明示的WITH CONCURRENT ISOLATED LOADINGまたはWITH NO CONCURRENT ISOLATED LOADING構文を含まないDML文操作をシステムが処理する方法を説明しています。

状況の説明または使用される構文 操作のタイプ
テーブルはロード操作の一部です。 CLDI DML
DML操作には、全AMPテーブル レベル/パーティション レベルWRITEロックが必要です。 CLDI DML
セッションは同時実行ロード分離操作を無効にします。 NCLDI DML
DML操作は、FastLoad、MultiLoad、Teradata PTロード オペレータ、またはTeradata PT UpdateオペレータなどのMLOADXプロトコルを使用しないロード ユーティリティから行ないます。 NCLDI DML
テーブルは、ロード分離DMLレベルとしてFOR NONEに設定されています。 NCLDI DML
テーブルは、DMLレベルとしてFOR INSERTに設定されています。またDMLは、INSERTの部分を持つINSERTまたはMERGE-INTOではありません。 NCLDI DML
DML操作には、全AMPテーブルまたはパーティション レベルのWRITEロックが必要ありません。 NCLDI DML

ロックのルール

システムは常に、ロード分離テーブルのNCLDI DMLにEXCLUSIVEロックを使用します。同じロック レベルおよび関与するAMPのテーブルで、同時読み取り操作は、付随するトランザクションがEXCLUSIVEロックを解放するまで、常にブロックされます。

例えば、セッションでロードが無効になっていない場合は、次のルールが適用されます。
  • テーブルまたは結合インデックスの最初のCLDI DMLは、テーブルまたは結合インデックスを暗黙的トランザクション ベースのロード操作に設定します。
  • トランザクションのロード分離テーブルまたは結合インデックスの最初のCLDI DMLが全AMPでない場合、または全AMPであってもテーブル レベルのロック レベル操作でない場合、全AMPテーブル レベル ロックを取得する操作が強制されます。
  • 同じトランザクションの同じテーブルでCLDIとNCLDI DMLの両方を使用することはできません。このルールは、DMLの後続ロード分離タイプがすべて、最初のDMLのロード分離タイプと同じである必要があることを意味しています。
  • テーブルまたは結合インデックスの暗黙的なロードは、テーブルでの同時書き込み操作を防ぎます。

明示的なNCLDIの変更の例

この例は、明示的NCLDI変更を示しています。

EXPLAIN UPDATE WITH NO ISOLATED LOADING t1 SET c2 = c2 + 1;
*** Help information returned. 12 rows.
*** Total elapsed time was 1 second.
Explanation
-----------------------------------------------------------------------
  1) First, we lock db1.t1 for exclusive use on a reserved rowHash to
     prevent global deadlock.
  2) Next, we lock db1.t1 for exclusive use.
  3) We do an all-AMPs UPDATE (nonconcurrent load isolated) from
     db1.t1 (Load Uncommitted) by way of an all-rows scan with a
     condition of ("(db1.t1.TD_ROWLOADID_DEL = 0) AND ((1=1))"). The
     size is estimated with low confidence to be 4 rows. The estimated
     time for this step is 0.07 seconds.
  4) Finally, we send out an END TRANSACTION step to all AMPs involved
     in processing the request.
  -> No rows are returned to the user as the result of statement 1.
     The total estimated time is 0.07 seconds.

暗黙的ロード操作の例

この例は、暗黙的トランザクションの暗黙的ロード操作を示しています。UPDATEが変更中に行にバージョンを設定することを示す新しい説明要素concurrent load isolatedに注目してください。また、「Begin Isolated Load」がロード操作を開始し、“End Isolated Load”ステップがロード操作を終了することにも注目してください。TVMも更新され、コミット済みロードIDが反映されます。

EXPLAIN UPDATE t1 SET c2 = c2 + 1;
*** Help information returned. 18 rows.
*** Total elapsed time was 1 second.
Explanation
-----------------------------------------------------------------------
  1) First, we lock db1.t1 for write on a reserved rowHash to prevent
     global deadlock.
  2) Next, we lock db1.t1 for write.
  3)  We Begin Isolated Loadon buck.T1.
  4) We execute the following steps in parallel.
       1) We do an all-AMPs UPDATE (concurrent load isolated) from
          db1.t1 (Load Uncommitted) by way of an all-rows scan with a
          condition of ("(db1.t1.TD_ROWLOADID_DEL = 0) AND ((1=1))").
          The size is estimated with low confidence to be 4 rows. The
          estimated time for this step is 0.07 seconds.
       2) We lock DBC.TVM for write on a RowHash, and then we do a
          single-AMP UPDATE from DBC.TVM by way of the unique primary
          index "Field_1 = '00000204'XB, Field_2 = 'T1'" with no
          residual conditions.
  5)  We End Isolated Load.
  6) Finally, we send out an END TRANSACTION step to all AMPs involved
     in processing the request.
  -> No rows are returned to the user as the result of statement 1.

暗黙的なNCLDIの変更の例

この例は、暗黙的NCLDI変更を示し、t1には実行されている別の操作がないこと、さらにt1がまだ明示的ロード状態になっていないことを想定しています。

BEGIN TRANSACTION ;
EXPLAIN UPDATE t1 SET c2 = C2 +1 WHERE c1= 5;
 *** Help information returned. 6 rows.
 *** Total elapsed time was 1 second.
Explanation
----------------------------------------------------------------------
  1) First, we do a single-AMP UPDATE (nonconcurrent load isolated)
     from db1.t1 (Load Uncommitted) by way of the primary index
     "db1.t1.c1 = 5" with a residual condition of (
     "(db1.t1.TD_ROWLOADID_DEL = 0) AND ((1=1))"). The size is
     estimated with low confidence to be 2 rows. The estimated time
     for this step is 0.06 seconds.
  -> No rows are returned to the user as the result of statement 1.
     The total estimated time is 0.06 seconds.

CLDIおよびNCLDI変更

すべての既存のエラー ロギング ルールは、CLDI DMLが変更する該当する各行に適用されます。例外は次のとおりです。
  • MLOADX更新を使用した、子非ロード分離テーブルの変更の結果であるデータ行は、RI違反が発生した場合にロールバックされます。関連する情報は、エラー テーブルに記録されます。RIエラーがMLOADX更新から子ロード分離テーブルへの結果である場合、エラーは記録されますが、違反している行ではなくトランザクションがロールバックされます。
  • MLOADX更新を使用した、非ロード分離テーブルの変更の結果であるデータ行は、固有性違反が発生した場合にロールバックされます。関連する情報は、エラー テーブルに記録されます。固有性違反エラーがMLOADX更新からロード分離テーブルへの結果である場合、エラーは引き続き記録されますが、違反している行ではなくトランザクションがロールバックされます。
  • 一般的に、エラー ロギングが有効でMLOADXを使用して実行されるCLDI更新の変更された行の処理中にエラーが発生する場合、データ行はロールバックされません。その代わりに、関連するトランザクションがロールバックされます。

すべてのNCLDI変更は、非ロード分離テーブルに対する既存の変更ルールに従います。

CLDI INSERTの場合は、挿入される行が挿入されます。CLDI DELETEの場合、削除される行が同じロード操作で挿入された行だと、行は削除されます。それ以外の場合、削除される行はマークされてから、テーブルで更新されます。行でのCLDI更新は、次のように実行されます。
  • 更新される行が新たにロードに挿入された行でない場合は、CLDI DELETEが既存の行で実行され、CLDI INSERTは更新された値を持つ変更済みの行で実行されます。
  • 更新される行が現在のロード操作に挿入された行である場合は、同じ行が更新済みの値で変更されます。