タイトル: 動的パフォーマンスビュー (V$ビュー)
SEOタイトル: Oracle V$ ビュー入門 — v$session / v$sql / v$lock / AWR との関係
| この記事の要点 |
|
動的パフォーマンスビューとは
Oracle のインスタンスがメモリ上に持っている各種状態 (セッション、SQL キャッシュ、ロック、SGA 領域使用量など) を、SQL で リアルタイムに 参照できる仮想ビュー群です。SQL のセッションが続く限り常に最新値が返ります。
名前が V$ で始まることから、現場では 「V$ ビュー」「ブイドル ビュー」 と呼ばれます。
正体は X$ 表
本当に「ビュー」なのは表面上で、その下には X$ 表 (X ダラー表) と呼ばれる、SGA のメモリ構造を直接読むための内部表があります。X$ は SYS 以外には基本見えず、構造もパッチで変わるため、通常は V$ ビュー経由でアクセス します。
[ アプリ・DBA ]
│ SELECT * FROM v$session;
▼
[ V$SESSION (公開ビュー) ]
│
▼
[ GV$SESSION (RAC 全インスタンス版) ]
│
▼
[ X$KSUSE (内部 X$ 表 = SGA メモリへの窓) ]
GV$ は RAC (Real Application Clusters) で全インスタンスをまたいで参照したいときに使う「Global」版です。シングル構成では V$ と同じ結果が返ります。
代表的な V$ ビュー
| ビュー | 用途 | よく見る列 |
|---|---|---|
v$version | Oracle のバージョンとエディション | BANNER |
v$instance | インスタンス名 / 起動時刻 / 状態 | INSTANCE_NAME, STARTUP_TIME, STATUS |
v$database | DB 名、DBID、Log Mode | NAME, LOG_MODE, OPEN_MODE |
v$session | 現在接続中の全セッション | SID, SERIAL#, USERNAME, MACHINE, STATUS, EVENT |
v$process | サーバ側 OS プロセス | PID, SPID, PROGRAM |
v$sql | 共有プールに残っている個別の SQL 実行計画 | SQL_ID, SQL_TEXT, EXECUTIONS, ELAPSED_TIME |
v$sqlarea | SQL_ID 単位に集約した SQL | SQL_ID, EXECUTIONS, BUFFER_GETS |
v$sga / v$sgastat | SGA サイズ / プール別内訳 | NAME, BYTES |
v$lock | 現在の Enqueue ロック | SID, TYPE, ID1, ID2, LMODE, REQUEST |
v$bgprocess | バックグラウンドプロセス一覧 | NAME, PADDR, DESCRIPTION |
v$session_wait | 各セッションの待機イベント | SID, EVENT, WAIT_TIME |
v$active_session_history (ASH) | 過去 1 秒粒度のセッション活動 | SAMPLE_TIME, SQL_ID, EVENT |
使い方の例
バージョン確認
SELECT * FROM v$version;
-- BANNER
-- ----------------------------------------------------------------
-- Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
-- Version 19.20.0.0.0
誰がつないでいるか
SELECT sid, serial#, username, machine, program, status, event
FROM v$session
WHERE username IS NOT NULL -- バックグラウンドを除外
ORDER BY logon_time DESC;
重い SQL を特定
SELECT sql_id,
executions,
ROUND(elapsed_time/1e6, 2) AS sec_total,
ROUND(elapsed_time/NULLIF(executions,0)/1e3, 2) AS ms_per_exec,
SUBSTR(sql_text, 1, 80) AS sql_preview
FROM v$sqlarea
ORDER BY elapsed_time DESC
FETCH FIRST 20 ROWS ONLY;
ロック待ちの調査
SELECT blocker.sid AS blocker_sid,
blocker.username AS blocker_user,
waiter.sid AS waiter_sid,
waiter.username AS waiter_user,
waiter.sql_id AS waiter_sql_id
FROM v$lock l_waiter
JOIN v$lock l_blocker
ON l_blocker.id1 = l_waiter.id1
AND l_blocker.id2 = l_waiter.id2
AND l_blocker.lmode > 0
AND l_waiter.request > 0
JOIN v$session waiter ON waiter.sid = l_waiter.sid
JOIN v$session blocker ON blocker.sid = l_blocker.sid;
SGA の内訳
SELECT pool, name, ROUND(bytes/1024/1024, 1) AS mb
FROM v$sgastat
WHERE bytes > 50*1024*1024
ORDER BY bytes DESC;
AWR / ASH との関係
V$ ビューは 「今の値」だけ しか返しません。インスタンス再起動でリセットされ、過去の傾向は見られません。長期トレンドや過去事象の調査には次の系統を使い分けます。
| 系統 | 粒度 | 保持 | 必要ライセンス |
|---|---|---|---|
| V$ / GV$ | 現在のスナップショット | インスタンス起動中のみ | 標準で利用可 |
| V$ACTIVE_SESSION_HISTORY (ASH) | 1 秒粒度のセッション活動 | SGA 内、数十分〜数時間 | Diagnostics Pack |
| DBA_HIST_* (AWR) | スナップショット (既定 1 時間) | 既定 8 日 (拡張可) | Diagnostics Pack |
| STATSPACK | AWR と同様 | ユーザーが管理 | 無料 |
権限と注意
- 所有者は
SYS。一般ユーザーで参照するにはSELECT_CATALOG_ROLE付与か、対象ビューに個別の SELECT 権限 - ロックや待機を見るための代表的な権限は
SELECT_CATALOG_ROLE+SELECT ANY DICTIONARY - V$ は セッション全体に対するメモリ読み込み を伴うので、極端に大量に SELECT すると本番負荷になる
- 名前が変わることはほぼ無いが、列の追加/削除はマイナーバージョンで起こる — マニュアルを必ず確認
FAQ
Q: V$ と GV$ の違いは?
A: GV$ は RAC で全インスタンス分の行を返す版です。INST_ID 列が追加され、シングル構成では結果が V$ と同じになります。
Q: v$sql と v$sqlarea の違い?
A: v$sql は子カーソル単位 (バインド変数別の実行計画ごと) に行を返し、v$sqlarea は SQL_ID 単位で集約済みです。性能調査の最初は v$sqlarea から見るのが定番。
Q: AWR が無いライセンスでも過去傾向を見たい
A: STATSPACK を導入してください。AWR と同等のレポートが無料で利用できます。