パフォーマンスチューニングを行ううえで、「待機イベント(Wait Event)」の理解は欠かせません。この記事では、待機イベントの概要から、よく使われる動的パフォーマンスビュー(v$session、v$system_eventなど)の見方、実際にロックをかけて待機イベントを観察する手順まで、図解とSQL付きで丁寧に解説します。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
待機イベントとは?
Oracleデータベースでは、ユーザーセッションがSQLを実行している間、何かのリソースを待っている時間が発生します。この「待ち時間(Wait Time)」の原因を特定するための情報が「待機イベント」です。
【図:セッションの状態】
+-------------+ +--------------------------+
| SQL実行中 | -----> | データブロックの取得待ち |
+-------------+ +--------------------------+
↓
イベント名:db file sequential read
代表的な待機イベント一覧
| イベント名 | 内容 |
|---|---|
db file sequential read | インデックスアクセス時のI/O待ち |
db file scattered read | フルテーブルスキャン時のI/O待ち |
enq: TX - row lock contention | ロック競合による待機 |
log file sync | REDOログ書き込みの同期待ち |
buffer busy waits | バッファキャッシュの競合 |
動的パフォーマンスビューの活用
v$session
現在のセッションごとの状態(実行中 or 待機中)や待機イベントが確認できます。
SELECT sid, serial#, status, event, wait_class, state
FROM v$session
WHERE username IS NOT NULL;
v$session_event
セッションごとに発生したイベントの累積情報が格納されています。
SELECT sid, event, total_waits, time_waited
FROM v$session_event
WHERE event NOT LIKE 'SQL*Net%';
v$system_event
インスタンス全体のイベント情報が格納されています。
SELECT event, total_waits, time_waited, average_wait
FROM v$system_event
WHERE event NOT LIKE 'SQL*Net%';
v$session_wait(※Oracle 10g以前)
セッションごとの現在の待機情報(Oracle 10g以降はv$sessionで事足ります)
RAC環境ではgv$ビューを使う
RAC環境ではインスタンスが複数存在するため、各インスタンスごとの情報を一括で取得するには、gv$ビューを使用する必要があります。
SELECT inst_id, sid, serial#, event, wait_class, state
FROM gv$session
~~~~~~~~~~★gv$ビュー
WHERE username IS NOT NULL;
【実例】ロックを発生させて待機イベントを確認する
以下の手順で、ロック競合を発生させ、enq: TX - row lock contention イベントを確認することができます。
1. テスト用表の作成
CREATE TABLE lock_test (
id NUMBER PRIMARY KEY,
name VARCHAR2(50)
);
INSERT INTO lock_test VALUES (1, 'taro');
COMMIT;
2. セッションAで更新してロックを保持
-- セッションA
UPDATE lock_test SET name = 'jiro' WHERE id = 1;
-- COMMITやROLLBACKをせずにこのままロックを保持
SQL> UPDATE lock_test SET name = 'jiro' WHERE id = 1; ★UPDATEを実行(commitしない)
1行が更新されました。
SQL>
3. セッションBで同じ行を更新し、ロック待ちにさせる
-- セッションB(別ターミナル)
UPDATE lock_test SET name = 'saburo' WHERE id = 1;
-- このSQLはセッションAのロックが解除されるまで待機状態になる
SQL> UPDATE lock_test SET name = 'saburo' WHERE id = 1; ★コマンドが完了せず待機する
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
4. セッションBの待機イベント確認
SELECT sid, event, wait_class, state
FROM v$session
WHERE username = '対象のユーザー名';
enq: TX - row lock contention というイベントが表示されれば、ロックによる待機が発生していることがわかります。
SQL> SELECT sid, event, wait_class, state
2 FROM v$session
3 WHERE username = 'USER1';
SID EVENT WAIT_CLASS STATE
---------- ------------------------------ ------------------------- --------------------
62 SQL*Net message from client Idle WAITING
82 enq: TX - row lock contention Application WAITING ★
まとめ
| 観点 | 内容 |
|---|---|
| 待機イベントとは | SQL実行時にリソース待ちが発生している状態 |
| 主なビュー | v$session, v$session_event, v$system_event, v$session_wait |
| RACでは? | 各インスタンスの情報を集約するためにgv$ビューを使う |
| 実験方法 | ロックを意図的に発生させてenq: TX - row lock contentionを確認 |
[参考]
C.3 待機イベントの説明




コメント