4.

Oracle データディクショナリ 完全ガイド(USER_/ALL_/DBA_ ビュー / V$ / 主要ビュー一覧)

編集
この記事の要点
  • データディクショナリは Oracle DB のメタデータ(DB 自身の構造情報)を格納するビュー群
  • 所有者は SYS。ユーザーは読み取り専用のビュー経由で参照
  • プレフィックスで権限スコープが決まる: USER_ (自分) / ALL_ (自分が見える) / DBA_ (全て、要権限)
  • 別系統に V$ 動的パフォーマンスビュー — インスタンス稼働状況をリアルタイム反映
  • 主要ビュー: USER_TABLES / USER_TAB_COLUMNS / USER_INDEXES / USER_CONSTRAINTS など
  • スキーマ調査・性能分析・監査・DDL 復元など運用と開発の両方で頻出

データディクショナリとは

データディクショナリとは、Oracle データベースの「メタデータ(データに関するデータ)」を格納する、システム所有の特別な表・ビュー群です。具体的には以下のような情報が入っています:

  • ユーザー・スキーマ情報(誰がいるか)
  • 表・ビュー・インデックスなどのオブジェクト定義
  • カラム・データ型・制約・デフォルト値
  • 権限・ロール
  • 表領域・データファイル
  • 統計情報・実行履歴

所有者は SYS ユーザーで、一般ユーザーは読み取り専用のビュー(=データディクショナリビュー)経由で参照します。

3 種類のプレフィックス

プレフィックス見える範囲
USER_自分が所有するオブジェクトのみUSER_TABLES
ALL_自分がアクセス可能なすべて (他人の表で権限ありも含む)ALL_TABLES
DBA_データベース全体(管理者権限が必要)DBA_TABLES

カラム構成はほぼ同じで、DBA_ / ALL_ には OWNER 列が追加されます (USER_ は自分なので省略)。

主要なデータディクショナリビュー

スキーマ・表関連

ビュー内容
USER_TABLES自分が所有する表の一覧
USER_TAB_COLUMNS表のカラム情報(型・長さ・NULL 可否)
USER_TAB_COMMENTS表のコメント
USER_COL_COMMENTSカラムのコメント
USER_INDEXESインデックス一覧
USER_IND_COLUMNSインデックスの構成カラム
USER_CONSTRAINTS制約 (PK / FK / UNIQUE / CHECK)
USER_CONS_COLUMNS制約の対象カラム
USER_VIEWSビューの定義
USER_SEQUENCESシーケンス一覧
USER_SYNONYMSシノニム一覧
USER_TRIGGERSトリガー一覧
USER_SOURCEパッケージ / プロシージャの本体
USER_OBJECTS全オブジェクトのメタ情報 (種別・状態)

ユーザー・権限・ロール

ビュー内容
DBA_USERS全ユーザー一覧
USER_USERS自分のアカウント情報
DBA_ROLESロール一覧
USER_ROLE_PRIVS自分が持つロール
USER_SYS_PRIVS自分のシステム権限
USER_TAB_PRIVS自分のオブジェクト権限

表領域・データファイル

ビュー内容
DBA_TABLESPACES表領域一覧
DBA_DATA_FILESデータファイル
DBA_FREE_SPACE空き領域
DBA_SEGMENTSセグメント(表・インデックスの実体)

動的パフォーマンスビュー (V$)

データディクショナリと並ぶ重要なメタ情報源が V$ ビューです。こちらはインスタンス(メモリ・SGA)の状態をリアルタイム反映するもので、性能分析や障害解析で頻用します。

ビュー内容
V$SESSION現在のセッション一覧
V$SQL共有プールに残っている SQL
V$SQL_PLAN実行計画
V$LOCKロック情報
V$DATABASEDB 基本情報
V$INSTANCEインスタンス情報
V$PARAMETER初期化パラメータ
V$LOGREDO ログ
V$STATNAME / V$SYSSTAT各種統計情報

実践クエリ集

自分の所有表を一覧

SELECT table_name, num_rows, last_analyzed
  FROM user_tables
 ORDER BY table_name;

特定表のカラム定義を見る

SELECT column_name, data_type, data_length, nullable, data_default
  FROM user_tab_columns
 WHERE table_name = 'EMPLOYEES'
 ORDER BY column_id;

外部キー関係を一覧

SELECT a.table_name        AS child_table,
       a.constraint_name   AS fk_name,
       a.column_name       AS child_column,
       b.table_name        AS parent_table,
       b.column_name       AS parent_column
  FROM user_cons_columns a
  JOIN user_constraints  c ON a.constraint_name = c.constraint_name
  JOIN user_cons_columns b ON c.r_constraint_name = b.constraint_name
 WHERE c.constraint_type = 'R';

インデックスとその構成カラム

SELECT i.table_name, i.index_name, i.uniqueness,
       c.column_position, c.column_name
  FROM user_indexes      i
  JOIN user_ind_columns  c ON i.index_name = c.index_name
 WHERE i.table_name = 'ORDERS'
 ORDER BY i.index_name, c.column_position;

無効になっているオブジェクト

SELECT object_name, object_type, status
  FROM user_objects
 WHERE status <> 'VALID';

DDL を抽出 (DBMS_METADATA)

-- 表の CREATE 文を取得
SELECT DBMS_METADATA.GET_DDL('TABLE', 'EMPLOYEES') FROM dual;

-- インデックスの DDL
SELECT DBMS_METADATA.GET_DDL('INDEX', 'IDX_EMP_DEPT') FROM dual;

-- ユーザー定義
SELECT DBMS_METADATA.GET_DDL('USER', 'SCOTT') FROM dual;

現在のセッションを見る (V$)

SELECT sid, serial#, username, status,
       machine, program, sql_id
  FROM v$session
 WHERE username IS NOT NULL;

DICTIONARY ビューでメタ情報を逆引き

-- 「TABLE」を含むビューを探す
SELECT table_name, comments
  FROM dictionary
 WHERE table_name LIKE '%TABLE%'
   AND ROWNUM <= 20;

DICTIONARY (短縮形 DICT) は「全データディクショナリビューの一覧」を返すメタの中のメタ。「あのビュー名なんだっけ?」のときに便利。

データディクショナリが Oracle 運用で欠かせない理由

Oracle データベースを運用していると、表構造の調査、権限の整理、性能のチューニング、障害発生時の原因切り分けなど、さまざまな場面でデータディクショナリの参照が必要になります。たとえば、開発チームから「ある表の構造を確認したい」という依頼が来た場合、USER_TAB_COLUMNS を SELECT すれば一発で全カラム情報が取得でき、わざわざ DDL ファイルを探したり、過去のドキュメントを掘り起こす必要はありません。

運用フェーズでは、夜間バッチで失敗した SQL の調査、長時間ロックを保持している犯人セッションの特定、容量不足の表領域の確認など、データディクショナリと V$ ビューを組み合わせて調査するのが日常的に行われます。「Oracle 上でいま何が起きているか」を完全に可視化できるのが、Oracle が伝統的に強いと言われるポイントの一つで、その源泉がまさにこのディクショナリビュー群です。

データディクショナリを安全に使うための注意点

強力で便利な反面、データディクショナリの使い方を誤ると本番環境に悪影響を及ぼすことがあります。例えば、DBA_OBJECTS のように全オブジェクトを返すビューを WHERE 句なしで SELECT すると、数万件〜数十万件の結果が返ってきて共有プールやネットワークに負荷をかけます。実運用では必ず適切な WHERE 句で絞り込み、必要なカラムだけ SELECT するようにしましょう。

また、データディクショナリビューの中にはライブのインスタンス状態を反映するもの (V$ 系) と、ディスクのメタデータを反映するもの (DBA_/ALL_/USER_) が混在しています。V$ ビューはインスタンス再起動でカウンタがリセットされたり、長期的なトレンド分析には適さなかったりするため、定常監視に使う場合は AWR や Statspack のような時系列スナップショット機能と組み合わせるのが推奨されます。さらに、データディクショナリビューの一部は権限を持つユーザーしかアクセスできないため、運用ロールには SELECT_CATALOG_ROLE を付与しておくとトラブル調査時に役立ちます。

FAQ

Q: USER_ と ALL_ の違いは?
A: USER_ は自分が所有するもの、ALL_ は自分が SELECT 権限を持つすべて。他人のスキーマで権限を付与された表も ALL_ に出る。

Q: DBA_ ビューにアクセスできない
A: DBA ロール、または SELECT_CATALOG_ROLE / SELECT ANY DICTIONARY 権限が必要。一般ユーザーには付かない。

Q: 表名が大文字なのはなぜ?
A: Oracle は引用符なしの識別子をすべて大文字化するため。WHERE 句では 'EMPLOYEES' のように大文字で書く。

Q: V$ と DBA_ の違いは?
A: V$ はメモリ(インスタンス)の今を反映、DBA_ はディスク上のメタデータ。再起動すると V$ は消える/リセット、DBA_ は残る。

Q: 一般ユーザーが SYS.* を直接見られる?
A: 直接の所有者は SYS だが、各ユーザーにはパブリックシノニムが貼られていて USER_TABLES のように接頭辞なしで使える。

関連記事

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. DDL
  2. DML
  3. トランザクション制御 (SQL)
  4. データディクショナリ
  5. 動的パフォーマンスビュー (V$ビュー)
  6. 関数

最近更新/作成されたページ