Enq: ST – contention

目次

基本情報

 

Oracle 8iのDMT(Dictionary Managed Tablespace)を使用する場合、エクステントの割り当てのような空間の管理タスクを実行するときに、Oracleはそのジョブを同期するためにSTロックを使用します。STロックは、インスタンス全体で単一です。特定の時点でスペース管理関連のタスク(例えばInsertによるエクステントの割り当てなど)が同時に過剰に発生している場合は、そのジョブを同期するために、ほとんどのセッションがSTロックを獲得するために待機することで、パフォーマンスの低下が発生することになります。STロック競合が発生すると、enq:ST – contentionイベントにより待機することになります。STロックによる競合は、Oracle8i以降提供されているLMT(Locally Managed Tablespace)を使用すると、ほとんど解決することができます。

DMTは、UET$、FET$などのエクステントに関連するディクショナリテーブルにエクステント情報を管理するため、エクステントの変更があるたびに、そのテーブルを参照し、変更する一連の作業が必要となります。例えば、大量のInsert操作によって10万個のエクステントの割り当てが発生した場合、UET$、FET$は、10万に対応するデータを読み取りと書き込みを行います。この作業は、すべてSTロックを獲得した後にのみ可能です。 STロックは、インスタンス全体で一つだけ使用可能なため、同時に複数のセッションがエクステントを割り当てられる場合、STロックを獲得するために熾烈な競合が行われるようになります。一方、LMTを使用している場合、エクステント情報は、データファイルのヘッダに存在するビットマップ領域に管理されてディクショナリ情報をほとんど参照されないためSTロックによる競合はほとんど発生しません。 Oracle 9iの以降、基本的にLMTが使用されるため、STロックによる競合は、もはやパフォーマンスの問題が発生しません。

オラクル8iからSTロック競合を減らすことができる3つの方法を提供します。

第一に、LMT機能を追加しました。LMTを効果的に使用することはDBAの役割であり、Oracle 9iの以降は、ほぼ基本的なセッティングがなされました。

第二に、TTロックの使用を拡大しました。オラクル8i以前のバージョンでは、TTロックは、STロックのようにインスタンスごとに一つだけ存在しており、インスタンス起動時にロールバック・セグメントを割り当てるとき獲得しました。しかし、Oracle8iから既存のSTロックを使用していたいくつかのテーブルスペースに関連するタスクのTTロックを使用します。TTロックを使用するジョブの種類は、ID2の値に指定されますが、ID2の値の意味は、メタリンクの文書番号34666.1で次のように表現されています。

0 - 表スペースを削除してロールバック・セグメントを作成する間のデッドロックを防止するために使用されます。
1 - 指定された表領域内のデータファイルの作成をシリアル化するために使用されます。
2 - 表領域のポイント・イン・タイム・リカバリ中に、表領域への他の操作の発生を防止するために使用されます。
4 - 表領域を作成するときに表領域IDをロックするために使用されます。
8 - ALTER TABLESPACE操作中にデッドロックを防止します。 これはBug 503594用に追加されました。
16 - エクステントの割り当てと割り当て解除を同期するために使用されます。

TTロックは、STロックとは異なり、表スペースごとに1つ使用可能なので、(ID1= tablespace#)STロックを使用する際に比べて競合を減少させる効果があります。TTロックを獲得するために待機するV$ SESSION_WATビューには、enq:TT – contentionイベントが記録されます。幸いなことにTTロック競合はほとんど発生しません。

第三に、LMTと一時テーブルスペース(Temporary tablespace)を導入しました。永続表スペース(Permanent Tablespace)を配置領域として使用する場合の並べ替えを実行に伴う過剰なエクステントの割り当てと解放は、STロックの競合を誘発し、これにより、パフォーマンスが大幅に低下する現象が発生します。特にSMONが配置領域を整理するためにSTロックを待機している場合、致命的なパフォーマンスの低下を引き起こす可能性があります。一時テーブルスペースはLMTを使用し、一時セグメントを割り当てて解除する過程で、より効果的なアルゴリズムを使用することで並べ替えの実行によるSTロック競合を解消します。

STロック競合現象は、Oracle8i以降ではほとんど問題にならなくなりました。オラクル8iで新たに追加されたLMTや一時テーブルスペースなどの機能を適切に使用すると、STロック競合は、実質的に完全に消えます。

 

パラメータと待機時間

 

待機パラメータ

 

1.P1:Enqueue情報
2.P2:0
3.P3:0

 

待機時間

 

enqueue待機イベントと同一で、最大3秒まで待ちます。もしSTロックを獲得する場合は、獲得するまで待機します。

 

チェックポイントと解決策

 

STロック競合を減少させる

STロック競合を減少させる方法は、次のとおりです。

・可能な場合、Oracle8i以降にアップグレードしLMTと一時テーブルスペース(Temporary Tablespace)機能を使用します。
・サブバージョンを使用するか、その他の理由により、LMT使用が不可能な場合は、適切なサイズのエクステントを使用します。
 エクステントのサイズが適当大きい場合には、エクステントの割り当て回数自体が減って相対的にSTロック競合が減少します。