17.10 - ロックと同時並行性 - Advanced SQL Engine - Teradata Database

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1184-171K-JPN
Language
日本語 (日本)

COLLECT STATISTICSリクエストを実行すると、システムはテーブルにACCESSロックを設定し、デモグラフィック データはこのテーブルから収集されます。データベースは、統計の収集後にDBC.StatsTblに行ハッシュレベルのWRITEロックを設定し、ディクショナリ行の更新に必要な間のみロックを持続します。COLUMN x1にあるCOLLECT STATISTICSリクエストのEXPLAIN (次の段階4で太字で示されている)動作を簡単に確認できます。

EXPLAIN COLLECT STATISTICS ON t1 COLUMN x1;

*** Help information returned. 18 rows.
*** Total elapsed time was 1 second.

Explanation
----------------------------------------------------------------
1) First, we lock DF2.t1 for access.
2) Next, we do a COLLECT STATISTICS step from DF2.t1 by way
   of an all-rows scan into Spool 3 (all_amps), which is built
   locally on the AMPs.
3) Then we save the UPDATED STATISTICS from Spool 3 (Last Use) into
   Spool 4, which is built locally on the AMP derived from 
    DBC.StatsTbl  by way of the primary index.
 4) We lock DBC.StatsTbl for write on a RowHash. 
5) We do a single-AMP MERGE DELETE to  DBC.StatsTbl  from Spool 4 
   (Last Use) by way of a RowHash match scan.  New updated rows are
   built and the result goes into Spool 5 (one-amp), which is built
   locally on the AMPs.
6) We do a single-AMP MERGE into  DBC.StatsTbl  from Spool 5 (Last Use).
7) We spoil the parser's dictionary cache for the table.
8) 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.

これらのロックにより、統計を収集中のデータ テーブルに対する新しいリクエストの構文解析は、操作が完了するまで行なわれなくなります。

一般に、COLLECT STATISTICSリクエストは、同一のテーブルに対して実行されるDMLリクエスト、他のCOLLECT STATISTICSリクエスト、DROP STATISTICSリクエスト、およびHELP STATISTICSリクエストと並行して実行できます。

同じテーブルに関する初回の統計収集を複数並行して実行しないようにしてください。ただし、別々のテーブルに関する統計の収集または再収集を実行するときに、統計関連の他のリクエスト(DROP STATISTICS、HELP STATISTICS、SHOW STATISTICSなど)を並行して実行することは可能です。

COLLECT STATISTICSリクエストは同一のテーブルに対して実行されるCREATE INDEXリクエストと並行して実行できます(両者が同一のインデックスを指定しない限り)。

このルールには以下の例外があります。前述の例外はCOLLECT STATISTICSリクエストにテーブルに対するLOCKING修飾子が使用されていない(または、LOCKING修飾子が指定されている場合はACCESSレベル ロックだけをリクエストしている)ということを前提としています。
  • DMLリクエストを含んだトランザクションがテーブルに対してEXCLUSIVEロックを掛ける場合、DMLリクエストがCOLLECT STATISTICSリクエストをブロックしたり、COLLECT STATISTICSリクエストがDMLリクエストをブロックしたりします。これは、どちらが先にテーブルにロックを掛けるかによって異なります。COLLECT STATISTICSはデフォルトでテーブルに対してACCESSロックを使用することに注意する必要があります。一般に、DMLリクエストと一緒にテーブルにEXCLUSIVEロックを指定するべきではありません。
  • COLLECT STATISTICSリクエストは、DBC.StatsTblに対する自身の行ハッシュのWRITEロックを取得できないようにブロックされます。これらのロックは、COLLECT STATISTICS操作がほぼ完了するときに要求され、新しく収集された統計でディクショナリ行を更新する間だけ維持されます。

    テーブルに関するディクショナリ情報がまだキャッシュに入っていない場合、これによりリクエストがブロックされることがあります。WRITEロック?されたらCOLLECT STATISTICSリクエストを即座に終了し、ブロックされたリクエストの構文解析をやり直す必要があります。