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リクエストと並行して実行できます(両者が同一のインデックスを指定しない限り)。
- DMLリクエストを含んだトランザクションがテーブルに対してEXCLUSIVEロックを掛ける場合、DMLリクエストがCOLLECT STATISTICSリクエストをブロックしたり、COLLECT STATISTICSリクエストがDMLリクエストをブロックしたりします。これは、どちらが先にテーブルにロックを掛けるかによって異なります。COLLECT STATISTICSはデフォルトでテーブルに対してACCESSロックを使用することに注意する必要があります。一般に、DMLリクエストと一緒にテーブルにEXCLUSIVEロックを指定するべきではありません。
- COLLECT STATISTICSリクエストは、DBC.StatsTblに対する自身の行ハッシュのWRITEロックを取得できないようにブロックされます。これらのロックは、COLLECT STATISTICS操作がほぼ完了するときに要求され、新しく収集された統計でディクショナリ行を更新する間だけ維持されます。
テーブルに関するディクショナリ情報がまだキャッシュに入っていない場合、これによりリクエストがブロックされることがあります。WRITEロック?されたらCOLLECT STATISTICSリクエストを即座に終了し、ブロックされたリクエストの構文解析をやり直す必要があります。