Oracle のデータディクショナリ(Data Dictionary)は、データベース内のすべてのオブジェクト・権限・ストレージ構造・統計情報を格納したシステムカタログです。テーブル定義の確認・オブジェクトの依存関係調査・スペース使用状況の確認など、日常的な開発・運用業務のあらゆる場面で参照します。
データディクショナリには DBA_*・ALL_*・USER_* の3層構造があり、アクセス権限によって使い分けます。また V$ から始まる動的パフォーマンスビューは、メモリ上の稼働情報(セッション・SQL・待機イベントなど)を提供するもので、データディクショナリとは別の仕組みです。
この記事でわかること
- USER_* / ALL_* / DBA_* の違いと使い分け
- オブジェクト・ソースコード・依存関係を確認するビュー
- テーブル・列・制約・インデックス定義を確認するビュー
- ストレージ(セグメント・エクステント・表領域)を確認するビュー
- V$ 動的パフォーマンスビューとの違い
- よく使うデータディクショナリクエリ集
USER_* / ALL_* / DBA_* の3層構造
| プレフィックス | 参照できる範囲 | 必要な権限 | 主な用途 |
|---|---|---|---|
USER_* |
現在のユーザーが所有するオブジェクトのみ | なし(すべてのユーザーが参照可) | 自分のスキーマの調査。owner 列は含まれない |
ALL_* |
自分が権限を持つすべてのオブジェクト | なし | 他スキーマのオブジェクトも含めて参照したい場合 |
DBA_* |
データベース内のすべてのオブジェクト | DBA 権限または SELECT ANY DICTIONARY | DBA 作業・スキーマ全体の調査 |
3層の違いを確認する
-- 現在のユーザーが所有するテーブルのみ SELECT table_name FROM USER_TABLES ORDER BY table_name; -- 権限のあるすべてのテーブル(他スキーマ含む) SELECT owner, table_name FROM ALL_TABLES ORDER BY owner, table_name; -- データベース内のすべてのテーブル(DBA権限が必要) SELECT owner, table_name FROM DBA_TABLES ORDER BY owner, table_name; -- USER_* には owner 列がない(自分のオブジェクトのみなので自明) -- ALL_* / DBA_* には owner 列がある
オブジェクトの管理と調査
DBA_OBJECTS / USER_OBJECTS でオブジェクトを調査する
-- スキーマ内のオブジェクトを種類別に一覧する
SELECT
object_name,
object_type, -- TABLE, VIEW, INDEX, PROCEDURE, FUNCTION, PACKAGE, TRIGGER, SEQUENCE など
status, -- VALID または INVALID(コンパイルエラーがある場合)
last_ddl_time, -- 最後に DDL が実行された日時
created -- オブジェクトの作成日時
FROM USER_OBJECTS
WHERE object_type IN ('TABLE', 'VIEW', 'PROCEDURE', 'FUNCTION', 'PACKAGE', 'TRIGGER')
ORDER BY object_type, object_name;
-- INVALID なオブジェクトを検出する(コンパイルエラー・依存オブジェクトの変更で無効化)
SELECT object_name, object_type, status
FROM USER_OBJECTS
WHERE status = 'INVALID'
ORDER BY object_type, object_name;
-- オブジェクト数を種類別に集計する
SELECT object_type, COUNT(*) AS cnt
FROM USER_OBJECTS
GROUP BY object_type
ORDER BY cnt DESC;
-- 特定のオブジェクトが存在するか確認する
SELECT COUNT(*) FROM USER_OBJECTS WHERE object_name = 'EMPLOYEES' AND object_type = 'TABLE';
-- 1 なら存在する。0 なら存在しない
テーブル・列・制約を調査する
テーブル定義の詳細を確認する
-- テーブルの基本情報(行数・ブロック数・最終統計収集日)
SELECT
table_name,
num_rows, -- 直近の統計収集時の行数(DBMS_STATS で更新)
blocks, -- 使用ブロック数
avg_row_len, -- 平均行長(バイト)
last_analyzed, -- 最後に統計を収集した日時
partitioned, -- YES: パーティションテーブル
iot_type, -- INDEX ORGANIZED: IOT テーブル
compression -- ENABLED/DISABLED: テーブル圧縮の設定
FROM USER_TABLES
WHERE table_name = 'EMPLOYEES';
-- 列の定義を確認する
SELECT
column_id,
column_name,
data_type,
data_length,
data_precision,
data_scale,
nullable, -- Y: NULL 許可、N: NOT NULL
data_default -- デフォルト値
FROM USER_TAB_COLUMNS
WHERE table_name = 'EMPLOYEES'
ORDER BY column_id;
-- 制約の一覧を確認する
SELECT
constraint_name,
constraint_type, -- P:主キー、U:一意、R:外部キー、C:チェック
search_condition, -- CHECK 制約の条件式
r_owner, -- 参照先スキーマ(外部キーの場合)
r_constraint_name, -- 参照先の制約名(外部キーの場合)
status, -- ENABLED / DISABLED
validated -- VALIDATED / NOT VALIDATED
FROM USER_CONSTRAINTS
WHERE table_name = 'EMPLOYEES'
ORDER BY constraint_type, constraint_name;
-- 外部キーの参照関係を確認する
SELECT
a.constraint_name AS fk_name,
a.table_name AS child_table,
b.table_name AS parent_table,
b.constraint_name AS pk_name
FROM USER_CONSTRAINTS a
JOIN USER_CONSTRAINTS b ON a.r_constraint_name = b.constraint_name
WHERE a.constraint_type = 'R'
ORDER BY a.table_name;
インデックスを調査する
USER_INDEXES / USER_IND_COLUMNS でインデックスを確認する
-- インデックスの一覧
SELECT
index_name,
index_type, -- NORMAL, BITMAP, FUNCTION-BASED NORMAL など
uniqueness, -- UNIQUE / NONUNIQUE
status, -- VALID / UNUSABLE
num_rows,
last_analyzed,
partitioned,
visibility -- VISIBLE / INVISIBLE(12c 以降)
FROM USER_INDEXES
WHERE table_name = 'EMPLOYEES'
ORDER BY index_name;
-- インデックスの構成列を確認する
SELECT
i.index_name,
c.column_position,
c.column_name,
c.descend -- ASC / DESC
FROM USER_INDEXES i
JOIN USER_IND_COLUMNS c ON i.index_name = c.index_name
WHERE i.table_name = 'EMPLOYEES'
ORDER BY i.index_name, c.column_position;
-- テーブルの主キーを構成するインデックスを確認する
SELECT
c.constraint_name,
i.index_name,
ic.column_name,
ic.column_position
FROM USER_CONSTRAINTS c
JOIN USER_INDEXES i ON c.index_name = i.index_name
JOIN USER_IND_COLUMNS ic ON i.index_name = ic.index_name
WHERE c.table_name = 'EMPLOYEES'
AND c.constraint_type = 'P'
ORDER BY ic.column_position;
ソースコードと依存関係を確認する
USER_SOURCE / USER_DEPENDENCIES でコードと依存を調査する
-- PL/SQL オブジェクトのソースコードを確認する
SELECT line, text
FROM USER_SOURCE
WHERE name = 'PROCESS_ORDER' -- プロシージャ/関数/パッケージ名(大文字)
AND type = 'PROCEDURE' -- PROCEDURE / FUNCTION / PACKAGE / PACKAGE BODY / TRIGGER
ORDER BY line;
-- 特定のキーワードを含むオブジェクトを検索する(コードの全文検索)
SELECT DISTINCT name, type
FROM USER_SOURCE
WHERE UPPER(text) LIKE '%EMPLOYEES%' -- EMPLOYEES を参照しているオブジェクトを探す
ORDER BY type, name;
-- オブジェクトの依存関係を確認する(このオブジェクトが何に依存しているか)
SELECT
name AS object_name,
type AS object_type,
referenced_name AS depends_on,
referenced_type AS dep_type,
referenced_owner AS dep_owner
FROM USER_DEPENDENCIES
WHERE name = 'EMP_SUMMARY_V' -- 調査対象のビュー名
ORDER BY referenced_type, referenced_name;
-- 逆方向: このテーブルに依存しているオブジェクトを確認する
SELECT
name AS dependent_object,
type AS dependent_type
FROM USER_DEPENDENCIES
WHERE referenced_name = 'EMPLOYEES'
AND referenced_type = 'TABLE'
ORDER BY type, name;
ストレージとスペース使用状況を確認する
DBA_SEGMENTS / DBA_EXTENTS で使用スペースを確認する
-- セグメント(テーブル・インデックス)のサイズを確認する
SELECT
segment_name,
segment_type,
tablespace_name,
bytes / 1024 / 1024 AS size_mb,
blocks,
extents
FROM USER_SEGMENTS
ORDER BY bytes DESC;
-- スキーマ単位の使用スペースを集計する(DBA権限)
SELECT
owner,
SUM(bytes) / 1024 / 1024 AS total_mb
FROM DBA_SEGMENTS
GROUP BY owner
ORDER BY total_mb DESC;
-- 表領域の空き容量を確認する(DBA権限)
SELECT
tablespace_name,
ROUND(SUM(bytes) / 1024 / 1024, 1) AS free_mb
FROM DBA_FREE_SPACE
GROUP BY tablespace_name
ORDER BY free_mb;
-- 表領域全体のサイズと使用率を確認する(DBA権限)
SELECT
d.tablespace_name,
ROUND(d.total_mb, 1) AS total_mb,
ROUND(d.total_mb - NVL(f.free_mb, 0), 1) AS used_mb,
ROUND(NVL(f.free_mb, 0), 1) AS free_mb,
ROUND((d.total_mb - NVL(f.free_mb, 0)) / d.total_mb * 100, 1) AS pct_used
FROM (
SELECT tablespace_name, SUM(bytes) / 1024 / 1024 AS total_mb
FROM DBA_DATA_FILES GROUP BY tablespace_name
) d
LEFT JOIN (
SELECT tablespace_name, SUM(bytes) / 1024 / 1024 AS free_mb
FROM DBA_FREE_SPACE GROUP BY tablespace_name
) f ON d.tablespace_name = f.tablespace_name
ORDER BY pct_used DESC;
V$ 動的パフォーマンスビューとの違い
| 種類 | プレフィックス例 | 内容 | 格納場所 |
|---|---|---|---|
| データディクショナリ | USER_TABLES, DBA_OBJECTS, ALL_COLUMNS | スキーマ・オブジェクト・権限などの定義情報 | SYSTEM 表領域(ディスク) |
| 動的パフォーマンスビュー | V$SESSION, V$SQL, V$WAIT_CLASS | 現在のセッション・SQL・待機イベントなどの稼働情報 | 共有メモリ(SGA)上 |
| GV$ ビュー | GV$SESSION, GV$SQL | RAC 環境の全インスタンスの稼働情報 | 各インスタンスの SGA |
よく使う V$ ビューの例
-- V$SESSION: 現在のセッション情報 SELECT sid, serial#, username, status, sql_id FROM V$SESSION WHERE username IS NOT NULL; -- V$SQL: ライブラリキャッシュ上の SQL 情報 SELECT sql_text, executions, elapsed_time/1000000 AS elapsed_sec FROM V$SQL WHERE executions > 0 ORDER BY elapsed_time DESC FETCH FIRST 10 ROWS ONLY; -- V$LOCK: 現在保持・待機中のロック情報 SELECT l.sid, l.type, l.mode_held, l.mode_requested FROM V$LOCK l WHERE l.block = 1;
よく使うデータディクショナリクエリ集
実務でよく使うデータディクショナリクエリ
-- ① 最近作成・変更されたオブジェクトを確認する
SELECT object_name, object_type, last_ddl_time
FROM USER_OBJECTS
WHERE last_ddl_time >= SYSDATE - 7 -- 直近1週間
ORDER BY last_ddl_time DESC;
-- ② テーブルのすべての列をコンマ区切りで取得する(SELECT 文の作成に便利)
SELECT LISTAGG(column_name, ', ') WITHIN GROUP (ORDER BY column_id) AS column_list
FROM USER_TAB_COLUMNS
WHERE table_name = 'EMPLOYEES';
-- ③ 外部キーがあるのに参照先にインデックスがないテーブルを検出する
SELECT
a.table_name AS child_table,
a.column_name AS fk_column
FROM USER_CONS_COLUMNS a
JOIN USER_CONSTRAINTS c ON a.constraint_name = c.constraint_name
WHERE c.constraint_type = 'R' -- 外部キー
AND NOT EXISTS (
SELECT 1 FROM USER_IND_COLUMNS i
WHERE i.table_name = a.table_name
AND i.column_name = a.column_name
AND i.column_position = 1
);
-- → パフォーマンス問題の原因になりやすい(外部キー列にはインデックスを付ける)
-- ④ 統計が古いテーブルを検出する(最終統計収集が30日以上前)
SELECT table_name, num_rows, last_analyzed
FROM USER_TABLES
WHERE last_analyzed < SYSDATE - 30
OR last_analyzed IS NULL
ORDER BY last_analyzed NULLS FIRST;
-- ⑤ DDL を取得する(DBMS_METADATA)
SELECT DBMS_METADATA.GET_DDL('TABLE', 'EMPLOYEES') FROM DUAL;
SELECT DBMS_METADATA.GET_DDL('INDEX', 'EMP_PK') FROM DUAL;
SELECT DBMS_METADATA.GET_DDL('VIEW', 'HR_DEPT60_V') FROM DUAL;
まとめ
- USER_* / ALL_* / DBA_*:USER_* は自分のオブジェクトのみ・ALL_* は権限のある全オブジェクト・DBA_* は全オブジェクト(DBA権限必要)の3層構造
- DBA_OBJECTS / USER_OBJECTS:オブジェクトの種類・VALID/INVALID 状態・作成日時・最終 DDL 日時を確認。INVALID オブジェクトの早期発見に使う
- USER_TAB_COLUMNS / USER_CONSTRAINTS:テーブル定義・列定義・制約(PK/FK/CHECK)を確認する基本ビュー
- USER_SOURCE / USER_DEPENDENCIES:PL/SQL ソースコードの全文検索・オブジェクト間の依存関係(どのテーブルを参照しているか・どのオブジェクトに依存されているか)を確認できる
- DBA_SEGMENTS / DBA_FREE_SPACE:表領域の使用量・空き容量を確認する。定期的な監視に使う
- V$ 動的パフォーマンスビュー:データディクショナリとは別にメモリ上の稼働情報を提供する。セッション・SQL・ロック・待機イベントの調査に使う
インデックスの作成・選択の詳細は Oracle インデックス完全ガイドを参照してください。DBMS_METADATA を使った DDL 取得の詳細は Oracle DBMS_METADATA 完全ガイドも参照してください。ビュー(VIEW)の定義確認には Oracle ビュー完全ガイドも参考になります。