Oracleデータベースの内部構造を理解し、効率的な管理・診断を行うには、データディクショナリビューの正確な使い分けが不可欠です。これらはシステムが自動生成するメタデータの集約であり、ユーザー権限に応じて3つの主要なプレフィックスで分類されます: USER_(自身が所有するオブジェクト)、ALL_(自身がアクセス可能なオブジェクト)、DBA_(全データベースオブジェクト)。本稿では、実務で頻出する10の代表的ビューを再構成し、その設計意図と実践的なクエリ例を示します。
1. オブジェクトカタログ:CAT と USER_CATALOG
CAT は USER_CATALOG のパブリック同義詞で、現在のスキーマに属する表、ビュー、シーケンス、シノニムの一覧を提供します。列は最小限の TABLE_NAME と TABLE_TYPE の2つのみですが、迅速な存在確認に最適です。
-- 現在のユーザーが所有するすべてのテーブルとビューを取得
SELECT table_name, table_type
FROM cat
WHERE table_type IN ('TABLE', 'VIEW');
2. 全オブジェクト情報:OBJ と USER_OBJECTS
OBJ は USER_OBJECTS の短縮形で、クラスタ、PL/SQLパッケージ、トリガー、マテリアライズド・ビューなど、あらゆるスキーマオブジェクトのライフサイクル情報を網羅します。特に LAST_DDL_TIME と STATUS を組み合わせることで、最近変更された無効化オブジェクトを即座に検出可能です。
-- 有効だが直近24時間以内にDDLが実行されたオブジェクト
SELECT object_name, object_type, last_ddl_time
FROM obj
WHERE status = 'VALID'
AND last_ddl_time > SYSDATE - 1;
3. テーブル構造:TABS と USER_TABLES
TABS は USER_TABLES の同義詞で、物理ストレージ特性や統計情報(NUM_ROWS, LAST_ANALYZED)を含む詳細なテーブル定義を返します。パーティションや圧縮設定などの最新機能も反映されています。
-- 分析済みかつ行数が1万を超えるテーブルを抽出
SELECT table_name, num_rows, last_analyzed
FROM tabs
WHERE num_rows > 10000
AND last_analyzed IS NOT NULL;
4. カラム定義:COLS と USER_TAB_COLUMNS
COLS はカラムレベルのメタデータを提供し、データ型、長さ、NULL許容性だけでなく、統計情報(NUM_DISTINCT, NUM_NULLS)も含まれます。これはクエリ最適化やインデックス設計の根幹となる情報です。
-- 指定テーブルの主キー候補を推定(NOT NULLかつ高選択性)
SELECT column_name, data_type, num_distinct, num_nulls
FROM cols
WHERE table_name = 'ORDERS'
AND num_nulls = 0
AND num_distinct > (SELECT num_rows * 0.9 FROM tabs WHERE table_name = 'ORDERS');
5. ビュー定義:USER_VIEWS
USER_VIEWS はビューのソースSQL(TEXT)をLONG型で保持しており、動的解析が必要です。ただし、TEXT_LENGTH を利用して複雑なビューをフィルタリングできます。
-- 定義が1000バイトを超えるビューを一覧表示
SELECT view_name, text_length
FROM user_views
WHERE text_length > 1000;
6. シノニム解決:SYN と USER_SYNONYMS
SYN を通じて、アプリケーション内で使用される論理名が実際の物理オブジェクト(TABLE_OWNER, TABLE_NAME)とどう対応しているかを即時にトレースできます。これは権限問題の切り分けに極めて有効です。
-- 'EMP_DATA' というシノニムが指す実体を特定
SELECT table_owner, table_name, db_link
FROM syn
WHERE synonym_name = 'EMP_DATA';
7. シーケンス状態:SEQ と USER_SEQUENCES
SEQ はシーケンスの現在値(LAST_NUMBER)、増分、キャッシュサイズを返します。急激な値の増加は、不正な使用またはロールバック未処理のサインである可能性があります。
-- キャッシュが無効または小さすぎるシーケンスを検出
SELECT sequence_name, cache_size, last_number
FROM seq
WHERE cache_size < 20 OR cache_size IS NULL;
8. 回収済みオブジェクト:RECYCLEBIN
RECYCLEBIN は削除されたオブジェクトの履歴を保持し、CAN_UNDROP 列で復元可能かどうかを判断できます。重要なテーブルを誤削除した際の最初の調査ポイントです。
-- 最近削除されたテーブルを時系列で並べる
SELECT original_name, operation, droptime, space
FROM recyclebin
WHERE type = 'TABLE'
ORDER BY droptime DESC;
9. 制約と関連カラム:USER_CONSTRAINTS と USER_CONS_COLUMNS
制約の種類(P=主キー、R=外部キー、C=チェック)と、それがどのカラムに適用されているかを結合して分析することで、データ整合性の依存関係を可視化できます。
-- 'CUSTOMERS' テーブルの外部キー制約と参照先を表示
SELECT uc.constraint_name, ucc.column_name,
uc.r_constraint_name, rc.table_name AS referenced_table
FROM user_constraints uc
JOIN user_cons_columns ucc ON uc.constraint_name = ucc.constraint_name
LEFT JOIN user_constraints rc ON uc.r_constraint_name = rc.constraint_name
WHERE uc.table_name = 'CUSTOMERS' AND uc.constraint_type = 'R';
10. 動的パフォーマンスビュー:V$ と V_$ の権限モデル
V$ で始まるビューは、V_$ の同義詞であり、直接付与できるのは V_$ に対してのみです。これはセキュリティ上の設計で、V$ 自体へのGRANTはORA-02030エラーとなります。
-- 正しい権限付与(v_$session に対して)
GRANT SELECT ON v_$session TO app_user;
-- 間違った例(失敗する)
-- GRANT SELECT ON v$session TO app_user;