デッドロックの削減 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - データベースの管理

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年6月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/rgu1556127906220.ditamap
dita:ditavalPath
ja-JP/rgu1556127906220.ditaval
dita:id
B035-1093
Product Category
Software
Teradata Vantage
  • ダーティ読み取りが可能な場合は常に、LOCKING FOR ACCESSを使用する。ただし、CREATE INDEXは例外。
  • BTEQでトランザクション処理を扱うことを検討する。BTEQは、トランザクションのロールバック後に、トランザクションの処理をトランザクションの始めからではなく、障害が発生した場所から続行します。
  • フォールバック テーブルに対してDSSの更新とPIの更新の両方が行なわれる場合は、DBS制御ユーティリティを使用してDeadLockTimeoutフィールドを30秒に設定します。
  • Archive/Recoveryのジョブに対して、必ずRELEASE LOCKSを使用する。
  • トランザクションの前に、LOCKING ROW[FOR]WRITE/EXCLUSIVE文節を使用する。この文節を使用すると、ターゲット テーブルに対してすでに使用されているロックがオーバーライドされることはなくなります。LOCKING ROWを使用するのが適切なのは、PIまたはSIの制約に基づいている単一テーブル選択についてのみです。例えば、次のようになります。
    LOCKING ROW FOR WRITE
    SELECT y FROM tableA WHERE pi =1;
    UPDATE tableA SET y=0 WHERE pi =1;
  • マクロでは、テーブル レベルのデッドロックを最小限に抑えるために、トランザクションの開始(BT)/トランザクションの終了(ET)ではなく、複文リクエストを使用する。例えば、次のようになります。
    LOCKING ROW FOR WRITE
    SELECT y FROM tableA WHERE pi =1
    ; UPDATE tableA SET y=0 WHERE pi =1 ;

    上記のようにすると、すべての必要なロックが開始時点で適用されるようになり、デッドロックが発生する可能性がなくなります。処理順序を調べるには、EXPLAIN修飾子を使用します。

  • 基本テーブルの複数の行が結合インデックス サブテーブルの1行を共有しているテーブルを更新する場合は(集約結合インデックスのほとんどの場合)、同じ行に深刻な衝突が生じることがあるため注意してください。