먼저 큰 개념부터
Data Dictionary = 데이터베이스의 메타데이터를 담고 있는 SYS 스키마의 내부 테이블 + 그걸 감싸는 뷰들
-어떤 유저가 있는지
-어떤 테이블/인덱스/제약조건이 있는지
-어떤 권한/롤이 부여돼 있는지
-어떤 세그먼트/파일/테이블스페이스가 있는지
이런 “DB 자기 자신에 대한 정보”를 저장하고 있는 영역이 데이터 딕셔너리이다.
실제로는 SYS 소유의 내부 테이블들(예: TAB, USER$ …)에 저장되어 있고,
우리가 직접 그 테이블을 보는 대신, 공식적으로 허용된 창구가 바로 딕셔너리 뷰 들이다.
보통 “딕셔너리 뷰”라고 하면 아래 네 부류를 통틀어 부르는 경우가 많다.
-접두어: USER_
-예: USER_TABLES, USER_TAB_COLUMNS, USER_INDEXES
-현재 접속 유저가 소유한 오브젝트 기준으로 정보 제공
-OWNER 컬럼은 보통 없음 (본인 것만 보니까)
SELECT table_name
FROM user_tables;
-접두어: ALL_
-예: ALL_TABLES, ALL_TAB_COLUMNS
-현재 유저가 접근 가능한 오브젝트(본인 + 권한 받은 것) 기준
-다른 스키마의 오브젝트도 포함 가능
SELECT owner, table_name
FROM all_tables
WHERE owner <> USER;
-접두어: DBA_
-예: DBA_TABLES, DBA_TAB_COLUMNS, DBA_USERS, DBA_DATA_FILES
-데이터베이스 전체 기준(모든 스키마, 모든 오브젝트)
-보통 DBA 롤 또는 적절한 시스템 권한이 있어야 조회 가능
SELECT owner, table_name, tablespace_name
FROM dba_tables
ORDER BY owner, table_name;
-접두어: V
-예: VSQL, VUNDOSTAT
-data dictionary와 함께 “딕셔너리 뷰” 카테고리에 묶어서 부르기도 하지만,
역할이 조금 다르고 이름은 따로 Dynamic Performance Views라고 부름
“지금 이 순간 상태(세션, 대기, 메모리, I/O 등)”를 보여주는 뷰
SELECT sid, serial#, username, event
FROM v$session
WHERE username IS NOT NULL;
이제 질문의 핵심인 DICT.
DICT는 사실 뷰 이름이 아니라 public synonym입니다.
원래 뷰 이름은 DICTIONARY
둘 다 같은 걸 가리킵니다.
내용은 아주 단순합니다.
DESC DICT;
-- 보통 이런 구조
TABLE_NAME VARCHAR2 -- 딕셔너리 뷰 이름
COMMENTS VARCHAR2 -- 그 뷰에 대한 설명
하면, DBA_TABLES, DBA_TAB_COLUMNS, DBA_TAB_PRIVS 같은 뷰 이름과
각각의 용도가 COMMENTS 컬럼에 영문으로 나옵니다.
그래서:
처음 보는 DBA_XXX 뷰가 나왔을 때
“이게 무슨 뷰야?” 싶으면
SELECT table_name, comments
FROM dict
WHERE table_name = 'DBA_CONSTRAINTS';
이렇게 DICT를 통해 해당 뷰의 설명을 바로 찾아볼 수 있는 구조.
USER/ALL/DBA_ 같은 뷰 형태로 노출해주는 공식 인터페이스이고,
DICT(=DICTIONARY) 뷰는 그 딕셔너리 뷰들의 목록과 각 뷰에 대한 한 줄 설명을
TABLE_NAME, COMMENTS 형태로 보여주는 메타 뷰라고 이해하시면 됩니다.
그래서 새로운 DBA_ 뷰를 봤을 때 용도 모르겠으면
DICT에서 table_name으로 검색해서 comments를 먼저 확인하는 식으로 많이 씁니다.