Oracleデータディクショナリの核心ビューとその活用方法

Oracleデータベースの内部構造を理解し、効率的な管理・診断を行うには、データディクショナリビューの正確な使い分けが不可欠です。これらはシステムが自動生成するメタデータの集約であり、ユーザー権限に応じて3つの主要なプレフィックスで分類されます: USER_(自身が所有するオブジェクト)、ALL_(自身がアクセス可能なオブジェクト)、DBA_(全データベースオブジェクト)。本稿では、実務で頻出する10の代表的ビューを再構成し、その設計意図と実践的なクエリ例を示します。

1. オブジェクトカタログ:CAT と USER_CATALOG

CATUSER_CATALOG のパブリック同義詞で、現在のスキーマに属する表、ビュー、シーケンス、シノニムの一覧を提供します。列は最小限の TABLE_NAMETABLE_TYPE の2つのみですが、迅速な存在確認に最適です。

-- 現在のユーザーが所有するすべてのテーブルとビューを取得
SELECT table_name, table_type 
FROM cat 
WHERE table_type IN ('TABLE', 'VIEW');

2. 全オブジェクト情報:OBJ と USER_OBJECTS

OBJUSER_OBJECTS の短縮形で、クラスタ、PL/SQLパッケージ、トリガー、マテリアライズド・ビューなど、あらゆるスキーマオブジェクトのライフサイクル情報を網羅します。特に LAST_DDL_TIMESTATUS を組み合わせることで、最近変更された無効化オブジェクトを即座に検出可能です。

-- 有効だが直近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

TABSUSER_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;

タグ: Oracle datadictionary systemviews SQL DBA

8月8日 07:42 投稿