Oracleの待機イベントとは?v$sessionやv$system_eventの見方と実例解説

Oracle Master Gold

パフォーマンスチューニングを行ううえで、「待機イベント(Wait Event)」の理解は欠かせません。この記事では、待機イベントの概要から、よく使われる動的パフォーマンスビュー(v$sessionv$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 syncREDOログ書き込みの同期待ち
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 待機イベントの説明

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました