プロキシ ロックは、ロックを待ち行列に入れて、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を持つパーティションにプロキシ ロックが掛けられる場合があります。この予約済み内部パーティション番号は、実際のパーティション用に生成できない値です。予約済みパーティションは、テーブルに対する複数の書き込みを防ぐために使用されます。
テーブル レベル プロキシ ロック
次のシナリオについて考えてみます。
- User_1は全AMPリクエストを実行依頼する。
- PEを生じるリクエストは、テーブルのゲートキーパーAMPにメッセージを送る。
- ゲートキーパーAMPは、予約済みハッシュ値を使用して、テーブルに行ハッシュ ロックを掛けます。
- 現時点ではテーブルがロックされていないため、user_1リクエストは要求された予約済み行ハッシュ ロックを取得し、各AMPのロックの取得を続行する。
- その間に、user_2は同じテーブルに対する全AMPリクエストを実行依頼する。
- PEを生じるリクエストは、テーブルのゲートキーパーAMPにメッセージを送る。
- ゲートキーパーAMPは、予約済みハッシュ値を使用してテーブルに行ハッシュ ロックを掛けようとする。
- user_1にはすでにテーブル用にロックされた行ハッシュがあるため、user_2からのリクエストは、user_1が送信したリクエストがテーブルでそのロックを解放するまで、待ち行列内で待機する必要があります。user_2のリクエストは、テーブルに対してプロキシ ロックを掛ける順序として次の位置にあったため、処理のためにテーブルをロックする待ち行列の中でも次の位置にあります。
Vantageは、全AMPロック リクエストを以下のように扱います。
- 全AMPリクエストを処理するPEは、テーブルIDハッシュ値を使用して、プロキシ ロックをテーブルに掛けるゲートキーパーAMPを決定します。
- プロキシ ロックを掛ける最初のリクエストは、全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の実際のテーブルに対する後続のテーブル レベル ロックに関連付けられている代表的なプロキシ ロックです。このフォームは、単一テーブルで常に使用されます。複数のテーブルをプロキシでロックする必要がある場合、Vantageは、テーブル レベル ロックを掛ける前に、それぞれに個別の単一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ロック ステップです。