ロックをつぶせ! 最初に疑うべき原因Oracleパフォーマンス障害の克服(2)(2/3 ページ)

» 2004年07月28日 00時00分 公開
[高橋潤@IT]

動的パフォーマンスビューによる調査

 問題となっているロックを特定していく作業に利用できるものが、その名前からも分かるように、V$LOCKV$SESSIONV$SQLAREAV$LOCK_OBJECTという動的パフォーマンスビュー注1です。それぞれの動的パフォーマンスビューからどのような情報を取得できるか確認するために、DESC[RIBE](各テーブルやビューの構成を表示するSQL*PLUSコマンド)コマンドと実際のSQL文で確認していきましょう。

注1動的パフォーマンスビュー
Oracleサーバが稼働している間、データベースの状態を保持している表に対するアクセスを可能にするビュー。「動的パフォーマンスビュー」「データディクショナリビュー」に関する詳細解説は、@IT記事「OracleMaster試験ポイント解説」にありますので参照してみてください。


V$LOCK

SQL> DESC V$LOCK
V$LOCK動的パフォーマンスビューの概要を取得する
(内容の抜粋は下記の表2参照)

列名 データ型 格納されているデータの内容
KADDR RAW(4) ロックアドレス
SID NUMBER ロックを保持しているセッションID
TYPE VARCHAR2(2) 要求しているロックタイプ。さまざまなキーワードが格納されているため、今回は以下のキーワードに注目
TM: DMLエンキュー
TX: トランザクションエンキュー
LMODE NUMBER 保持するロックモード。現在かけられているロックを示す
0:なし
1:NULL NULL
2:SS 行共有
3:SX 行排他
4:S 共有
5:SSX 共有/行排他
6:X 排他
REQUEST NUMBER 要求するロックモード。要求されているロックを示す
0:なし
1:NULL NULL
2:SS 行共有
3:SX 行排他
4:S 共有
5:SSX 共有/行排他
6:X 排他
CTIME NUMBER 現行のモードが付与されてから経過した時間
表2 V$LOCK動的パフォーマンスビュー(抜粋)

 この動的パフォーマンスビューは、現在アクティブになっているロックの状態を確認できます。「どのセッションがロックをかけているのか」ということを知るためには、SID列に格納されている、ロックを保持するセッションIDを使用します。

 また、TYPE列に注目してください。このロックタイプにはさまざまな種類がありますが、関連するデータは「TM」と「TX」になります。「TM」はDMLエンキューと呼ばれるデータの一貫性を保証するためのロックであり、「TX」はトランザクションエンキューと呼ばれるデータ構造の整合性を保証するためのロックとなります。つまり、ある表に対する更新要求が行われた場合、「TM」「TX」のロックが発生します。また、REQUEST列のデータが「0:なし」でない場合、そのセッションは現在更新要求を出しているが、ロックがかかって「待ち」が発生していることを示します。

 それでは、このビューから情報取得に有効な項目を取得してみましょう。ここでは、「TM」「TX」のデータに注目してください。

ロックの基本情報を取得するSQL文

SQL> SELECT SID,TYPE,LMODE,REQUEST,CTIME FROM V$LOCK WHERE TYPE IN ('TX','TM');
図1 V$LOCK動的パフォーマンスビューからSID(セッションID)、TYPE(ロックタイプ)、LMODE(ロックモード)、REQUEST(要求されているロック)、CTIME(ロックされた時間)を取得する 図1 V$LOCK動的パフォーマンスビューからSID(セッションID)、TYPE(ロックタイプ)、LMODE(ロックモード)、REQUEST(要求されているロック)、CTIME(ロックされた時間)を取得する(クリックで拡大します)

V$SESSION

 ロックをかけているセッション、ロックの状態は分かりました。それでは、V$LOCK動的パフォーマンスビューから取得したセッションIDを利用して、「どのユーザーがロックをかけているのか」「どのプログラムがロックをかけているのか」を解決をしましょう。このセッションの状態を格納している動的パフォーマンスビューがV$SESSIONです。このビューはたくさんの情報を保持していますのが、ここでは必要な部分を抜粋して解説します。

SQL> DESC V$SESSION

V$SESSION動的パフォーマンスビューの概要を取得する
(内容の抜粋は下記の表3参照)

列名 データ型 格納されているデータの内容
SADDR RAW(4) セッションアドレス
SID NUMBER セッションID
SERIAL# NUMBER セッションシリアル番号
USER# NUMBER オラクルログインユーザーID
USERNAME VARCHAR2(30) オラクルログインユーザー名
LOCKWAIT VARCHAR2(8) 待機中のロックのシステムアドレス
STATUS VARCHAR2(8) セッション状態
PROGRAM VARCHAR2(64) ログインしているプログラム名
LOGIN__TIME DATE ログインした時間
表3 V$SESSION動的パフォーマンスビュー(抜粋)

ロックをかけているユーザーとプログラムを特定するSQL文

SQL> SELECT SADDR,SID,SERIAL#,USERNAME,PROGRAM FROM V$SESSION WHERE SID = ANY(SELECT SID FROM V$LOCK WHERE TYPE IN ('TX','TM'));
図2 V$SESSION動的パフォーマンスビューで、V$LOCKから取得したSID列の値で絞り込み、SADDR(セッションアドレス)、SID(セッションID)、SERIAL#(セッションシリアル番号)、USERNAME(ログインユーザー名)、PROGRAM(ログインプログラム名)を取得する 図2 V$SESSION動的パフォーマンスビューで、V$LOCKから取得したSID列の値で絞り込み、SADDR(セッションアドレス)、SID(セッションID)、SERIAL#(セッションシリアル番号)、USERNAME(ログインユーザー名)、PROGRAM(ログインプログラム名)を取得する(クリックで拡大します)

 次ページでは引き続き、動的パフォーマンスビューを使った作業を解説し、最後に実践的なサンプルSQLを紹介します。(次ページに続く)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。