Direct path write

基本情報

 

direct path write待機イベントは、セッションPGA内部のバッファからデータファイルとして記録する場合に発生します。セッションは、多数のdirect writeを要求された後、処理を進行します。セッションが、I/O処理が完了したと認知した時点でdirect path write待機イベントを待機します。

 

direct path write待機はDirect load処理(CTAS:Create Table As Select、insert / * + append * / …など)が発生することを意味します。これらの操作が要求される場合、OracleはSGAを経由せずにデータファイルに直接書き込みを行います。つまり、DBWRによって書き込みが行われるのではなく、サーバー・プロセスによって直接書き込み操作が行われるのです。 CTAS(Create Table As Select)やInsert / * + append * /、DirectモードでSQL * Loaderを実行すると、direct load操作が実行されます。これらの作業は、次のような特徴を持ちます。。

 

・SGAを介さず、データファイルに直接書き込みを行います
・HWM以降にブロックを追加(Append)します。つまり、フリーリスト(FLM)やビットマップブロック(ASSM)で管理しているフリーブロックを使用していません。
・追加されたデータに対して、UNDOを生成しません。(ただしCTASの場合ディクショナリの変更のUNDOは生成されます。)
・テーブルにNologgingオプションが与えられた場合には、REDO(Redo)が生成されません。
・テーブルに対してTMロックをExclusiveに獲得するため、他のセッションでのDMLが許可されません。

 

Direct loadタスクを適切に使用すると、大容量のデータを高速で生成することができます。 DirectモードとParallelモードを並行して実行することにより、性能をさらに最大化することができるのです。 PCTAS(Parallel CTAS)、Insert / * + paralle append * /やdirect parallelモードでSQL * Loaderを実行することが代表的な例となります。 Parallelモードでデータが生成される場合、Oracleは、次のような方法で使用します。

 

・各スレーブセッションは、テーブルが属する表領域内に一時セグメント(Temporary Segment)を作成し、データを生成します。
 一時テーブルスペースがないにもかかわらず、一時セグメントが作成されることに注意してください。
 この場合、DBA_SEGMENTS.SEGMENT_TYPE列の値が「TEMPORARY」の値を持ちます。
・各スレーブセッションが作成された一時セグメントは、実行が終了すると、一つの一時セグメントにマージされます。
・コミット(Commit)が実行されると、一時セグメントは、テーブルのセグメントにマージされ、HWMが移動されます。
・ロールバック(Rollback)が実行されると、一時セグメントはDropされます。

 

Directモードである場合には、データが直接テーブルのセグメントに記録されますが、Parallelモードと並行されている場合には、一旦、テーブルのセグメントが属する永続表スペース(Permanent Tablespace)内の一時セグメント(Temporary Segment)に直接記録し、すべての操作が正常に終了した後、テーブルのセグメントにマージされることに注意してください。 Direct loadタスクを実行する際に発生するdirect path write待機は必然的なもので、待機の発生自体を減らすことはできません。もしdirect path writeイベントの平均待機時間が過度に高く出た場合、ファイルシステム自体の性能に問題があると判断することができます。

 

非同期I/Oが使用される場合には、direct path write待機イベントの待機回数と待機時間は誤解を招く可能性があります。 キャッシュされていないLOBセグメントに、書き込みI / O操作時に発生するdirect path write待機イベントは、Oracle 8.1.7からdirect path write(lob)待機イベントで別々に区分されます。

 

パラメータと待機時間

 

待機パラメータ

 

direct path write待機イベントの待機パラメータは以下の通りです。

 

・P1:Absolute File#
・P2:Starting Block#
・P3:ブロック数

 

待機時間

 

I/O関連のイベントなので、タイムアウトが発生せず、I/Oが完了するまでにかかった時間を示します。