そらとぶへび

仕事・プライベートを通しての気づき、JavaやPHP、データベースやサーバの話などこつこつと書いていきます

Oracle エンキューとは

Oracle周りのトラブル時の調査対応ためのメモ。


エンキューとは、共有メモリ以外の共有リソースを排他制御するためのロック・メカニズム
セッション・トランザクションと対応付けられる。
V$LOCKのTYPEで確認することができる。

エンキュー名の一覧
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19228-04/enqueues.htm


代表的なエンキュー

(1)HW

 テーブルなどのHWM(使用済みブロックの最後の位置)を引き上げするときに獲得するエンキュー。
 INSERT文を並列実行するなど、多量データを挿入する際に、エクステント・サイズが小さいと頻繁にエクステントを追加することになり、
 エンキュー獲得時間が長くなる。
 エクステント・サイズを大きくすることで、エクステント追加の回数を減らすことができるため、
 エンキュー待ちの発生を削減することが可能。
 保持しているロック情報を示すV$LOCKビュー上で、TYPE='HW'のレコードとして表される。

(2)SQ

 シーケンス(順序)を取得するのときに獲得するエンキューです。
 トランザクション・ロックは獲得しないが、多くのシーケンスを使用するINSERT文を並列実行すると待ちが発生する。
 
 →CACHEパラメータを大きくすることで待ちを少なくすることができる。
  ただし、システム障害などが発生すると、キャッシュされた値のうち、
  コミットされたトランザクションで使用されなかった番号は、欠番になるので注意が必要。

(3)TX、TM

  TX(トランザクションロック) → 行ロック・・・データ構造の整合性を保証するためのロック。
  TM(DMLエンキュー)     →表ロック・・・データの一貫性を保証するためのロック

TMロックはSELECT文以外では必ず獲得される。

ある表に対する更新要求が行われた場合、「TM」「TX」のロックが発生する。
V$LOCKのREQUEST列が「0:なし」意外の場合、そのセッションは更新要求を出しているが、
ロックがかかっていることを示す。

どのセッションがロックをかけているかは、SID列に格納されているセッションIDで、
V$SESSIONを検索することで分かる。