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が並行システムで各AMPにロックを掛ける場合に発生する可能性のあるグローバル デッドロックを回避するためのメカニズムを提供します(デッドロックを参照)。

READ、WRITE、またはEXCLUSIVEロック、またはロード分離テーブル(ロード分離を参照)のACCESSロックに、全AMP要求を作成する場合、システムは、全AMPロックを掛ける前に、単一AMPに対してプロキシ ロックを自動的に掛けます。プロキシ ロックは意図的ロックと見なすことができます。つまり、それは要求が各AMPにロックを掛けることを意図していることを示しています。

プロキシ ロックについて

プロキシ ロックにより、並列データベース体系で複数のAMPに渡るデータベース オブジェクトに対する連続ロックが使用可能になります。プロキシ ロックを使用しないと、複数のユーザーが同時に全AMPリクエストを同じテーブルに対して実行した場合、ほぼ確実にデッドロックが発生します。これは、そのテーブルに対する複数のリクエストが並行して送信された場合、テーブル行を保持するさまざまなAMPに異なる順番で到着することが多いためです。次に、各リクエストは、異なるAMPでそのテーブルに属する行をロックします。これにより、デッドロックの状況が発生します。

例えば、最初にuser_1からのリクエストがAMP3のテーブル行をロックし、user_2がAMP 4のテーブル行をロックするとします。user_1のリクエストがAMP4のテーブル行をロックしようとすると(またはuser_2のリクエストがAMP3のテーブル行をロックしようとすると)、グローバル デッドロックが生じます。プロキシ ロックは、そのようなデッドロックの発生を防止します。

プロキシ ロックには、以下の特性があります。

  • 各テーブルにはシステムで割り当てたテーブルIDがあり、これは固有ハッシュ値に関連付けることができます。このハッシュ値は、このテーブルのプロキシ ロックを掛ける、ゲートキーパーAMPと呼ばれる単一AMPを特定します。
  • プロキシ ロックがAMPに設定されないようにするため、テーブルIDハッシュ値は、AMP全体に均等に分散されます。ただし、同じテーブルには、同じAMPが常に使用されます。
  • READ、WRITE、またはEXCLUSIVEロック(またはロード分離テーブルのACCESSロック)の全AMPステップには、関連するゲートキーパーAMPに送信されてプロキシ ロックを掛ける単一AMPステップが常に先立ちます。
  • ゲートキーパーAMPは、予約済みハッシュ コード0xFFFFFFFFを使用して、テーブルに行ハッシュ ロックを掛けます。この予約済みハッシュ値は、ハッシュ関数で生成できない値です。
  • 行パーティション テーブルの場合、予約済み内部パーティション番号の0xFFFFFFFFFFFFFFFFを持つパーティションにプロキシ ロックが掛けられる場合があります。この予約済み内部パーティション番号は、実際のパーティション用に生成できない値です。予約済みパーティションは、テーブルに対する複数の書き込みを防ぐために使用されます。

テーブル レベル プロキシ ロック

次のシナリオについて考えてみます。

  1. User_1は全AMPリクエストを実行依頼する。
  2. PEを生じるリクエストは、テーブルのゲートキーパーAMPにメッセージを送る。
  3. ゲートキーパーAMPは、予約済みハッシュ値を使用して、テーブルに行ハッシュ ロックを掛けます。
  4. 現時点ではテーブルがロックされていないため、user_1リクエストは要求された予約済み行ハッシュ ロックを取得し、各AMPのロックの取得を続行する。
  5. その間に、user_2は同じテーブルに対する全AMPリクエストを実行依頼する。
  6. PEを生じるリクエストは、テーブルのゲートキーパーAMPにメッセージを送る。
  7. ゲートキーパーAMPは、予約済みハッシュ値を使用してテーブルに行ハッシュ ロックを掛けようとする。
  8. user_1にはすでにテーブル用にロックされた行ハッシュがあるため、user_2からのリクエストは、user_1が送信したリクエストがテーブルでそのロックを解放するまで、待ち行列内で待機する必要があります。user_2のリクエストは、テーブルに対してプロキシ ロックを掛ける順序として次の位置にあったため、処理のためにテーブルをロックする待ち行列の中でも次の位置にあります。

Teradata Databaseは、全AMPロック リクエストを以下のように扱います。

  1. 全AMPリクエストを処理するPEは、テーブルIDハッシュ値を使用して、プロキシ ロックをテーブルに掛けるゲートキーパーAMPを決定します。
  2. プロキシ ロックを掛ける最初のリクエストは、全AMPにわたるテーブルのロックを取得します。

次の例は、t4という名前の非パーティション テーブルからの単純なSELECTのEXPLAINレポートです。

EXPLAIN SELECT * FROM t4;
Explanation
-----------------------------------------------------------------------
  1) First, we  lock PLS.t4 for read on a reserved rowHash  to prevent
     global deadlock.
  2) Next, we  lock PLS.t4 for read.
  3) We do an all-AMPs RETRIEVE step from PLS.t4 by way of an all-rows
     scan with no residual conditions into Spool 1 (group_amps), which
     is built locally on the AMPs. The size of Spool 1 is estimated
     with low confidence to be 8 rows (344 bytes). The estimated time
     for this step is 0.15 seconds.
  4) Finally, we send out an END TRANSACTION step to all AMPs involved
     in processing the request.
  -> The contents of Spool 1 are sent back to the user as the result of
     statement 1. The total estimated time is 0.15 seconds.

ステップ1は、テーブルt4のゲートキーパーAMPに送信された単一AMPロック ステップです。ゲートキーパーAMPは、テーブルt4のテーブルIDのハッシュ値によって決定されます。ゲートキーパーAMPは、テーブルt4の予約済み行ハッシュを使用して、行ハッシュ ロックを掛けます。

ステップ2は、各AMPのテーブルt4にテーブル レベル ロックを掛ける全AMPロック ステップです。

上記の例で、ステップ1は、ステップ2の実際のテーブルに対する後続のテーブル レベル ロックに関連付けられている代表的なプロキシ ロックです。このフォームは、単一テーブルで常に使用されます。複数のテーブルをプロキシでロックする必要がある場合、Teradata Databaseは、テーブル レベル ロックを掛ける前に、それぞれに個別の単一AMPプロキシ ロックを掛けます。個々のステップで掛けられるプロキシ ロックとは異なり、複数テーブルのテーブル レベル ロックは1つの全AMPステップで掛けられることに注意してください。

次の例では、次のように作成されたt5という名前の行パーティション テーブルを使用しています。

CREATE TABLE t5 (a INTEGER, b INTEGER)
PRIMARY INDEX (a)
PARTITION BY RANGE_N (b BETWEEN 1 AND 100 EACH 1);

次の例は、テーブルt5からの単純な選択についてのEXPLAINレポートです。該当するEXPLAINテキストは太字で強調表示されています。

EXPLAIN SELECT * FROM t5;
Explanation
-----------------------------------------------------------------------
  1) First,  we lock PLS.t5 for read on a reserved rowHash in all 
     partitions to prevent global deadlock. 
  2) Next, we lock PLS.t5 for read.
  3) We do an all-AMPs RETRIEVE step from PLS.t5 by way of an all-rows
     scan with no residual conditions into Spool 1 (group_amps), which
     is built locally on the AMPs. The size of Spool 1 is estimated
     with low confidence to be 8 rows (344 bytes). The estimated time
     for this step is 0.15 seconds.
  4) Finally, we send out an END TRANSACTION step to all AMPs involved
     in processing the request.
  -> The contents of Spool 1 are sent back to the user as the result of
     statement 1. The total estimated time is 0.15 seconds.

ステップ1は、テーブルt5のゲートキーパーAMPに送信される単一AMPロック ステップです。ゲートキーパーAMPは、テーブルt5のテーブルIDのハッシュ値によって決定されます。ゲートキーパーAMPは、テーブルt5の予約済み行ハッシュを使用して、すべてのパーティションに行ハッシュ ロックを掛けます。

ステップ2は、各AMPのテーブルt5にテーブル レベル ロックを掛ける全AMPロック ステップです。

次の例は、単一パーティションのみがアクセスされる必要があるというようなパーティション列の条件を持つ、テーブルt5からの選択についてのEXPLAINレポートです。

EXPLAIN SELECT * FROM t5 WHERE b = 4;
Explanation
-----------------------------------------------------------------------
  1) First,  we lock PLS.t5 for read on a reserved rowHash in a single 
 partition to prevent global deadlock.   
  2) Next,  we lock PLS.t5 for read on a single partition. 
  3) We do an all-AMPs RETRIEVE step from a single partition of PLS.t5
     with a condition of ("PLS.t5.B = 4") with a residual condition of
     ("PLS.t5.B = 4") into Spool 1 (group_amps), which is built locally
     on the AMPs. The size of Spool 1 is estimated with no confidence
     to be 1 row (43 bytes). The estimated time for this step is 0.15
     seconds.
  4) Finally, we send out an END TRANSACTION step to all AMPs involved
     in processing the request.
  -> The contents of Spool 1 are sent back to the user as the result of
     statement 1. The total estimated time is 0.15 seconds.

ステップ1は、テーブルt5のゲートキーパーAMPに送信される単一AMPロック ステップです。ゲートキーパーAMPは、テーブルt5のテーブルIDのハッシュ値によって決定されます。ゲートキーパーAMPは、テーブルt5の予約済み行ハッシュを使用して単一パーティションに行ハッシュ ロックを掛けます。

ステップ2は、各AMPのテーブルt5にパーティション ロックを掛ける全AMPロック ステップです。

次の例は、ある範囲のパーティションへのアクセスを制限する条件を持つ、テーブルt5からの選択についてのEXPLAINレポートです。

EXPLAIN SELECT * FROM t5 WHERE b BETWEEN 3 AND 5;
Explanation
-----------------------------------------------------------------------
  1) First,  we lock PLS.t5 for read on a reserved rowHash in all 
 partitions to prevent global deadlock. 
  2) Next,  we lock PLS.t5 for read. 
  3) We do an all-AMPs RETRIEVE step from 3 partitions of PLS.t5 with a
     condition of ("(PLS.t5.B <= 5) AND (PLS.t5.B >= 3)") into Spool 1
     (group_amps), which is built locally on the AMPs. The size of
     Spool 1 is estimated with no confidence to be 2 rows (86 bytes).
     The estimated time for this step is 0.15 seconds.
  4) Finally, we send out an END TRANSACTION step to all AMPs involved
     in processing the request.
  -> The contents of Spool 1 are sent back to the user as the result of
     statement 1. The total estimated time is 0.15 seconds.

ステップ1は、テーブルt5のゲートキーパーAMPに送信される単一AMPロック ステップです。ゲートキーパーAMPは、テーブルt5のテーブルIDのハッシュ値によって決定されます。ゲートキーパーAMPは、テーブルt5の予約済み行ハッシュを使用して、(複数のパーティションにロックを掛ける必要があるため)すべてのパーティションに行ハッシュ ロックを掛けます。

ステップ2は、各AMPのテーブルt5にテーブル レベル ロックを掛ける全AMPロック ステップです。