데이터베이스/Oracle SQL

오라클 SQL과 PL/SQL - 데이터 딕셔너리 (Data Dictionary)

동띠기 2021. 8. 27. 22:00
728x90

데이터 딕셔너리 (Data Dictionary)

오라클은 데이터베이스를 운영하기 위한 정보들을 모두 특정한 테이블에 모아두고 관리하는데 그 테이블을 데이터 딕셔너리라고 합니다.
이 딕셔너리에는 아래와 같은 주요 정보들이 저장됩니다. 

오라클 데이터베이스의 메모리 구조와 파일에 대한 구조 정보
각 오브젝트들이 사용하고 있는 공간의 정보
제약 조건 정보
사용자에 대한 정보
권한이나 프로파일, 롤에 대한 정보
감사(Audit)에 대한 정보

이 외에도 많은 정보들이 있습니다.

이 정보들은 사람으로 비유하면 두뇌에 해당되는 정보들이기 때문에 만약 장애나 잘못 관리될 경우 오라클을 사용할 수 없고 더 심한 경우 복구조차 할 수 없게 될 수 있습니다.
그래서 오라클은 딕셔너리를 base table과 data dictionary view로 나누어 두고 data dictionary view를 통해서만 select할 수 있게 허용합니다.
만약 데이터베이스에 변경사항이 생겨 딕셔너리 내용을 변경해야 할 경우 사용자가 직접 수동으로 딕셔너리를 변경하지 못하고 해당 DDL 문장을 수행하는 순간 server process가 사용자를 대신해서 딕셔너리 내용을 변경해 줍니다.
base table는 데이터베이스를 생성하는 시점에 자동으로 만들어 집니다. 반면 data dictionary view는 catalog.sql이란 파일이 수행되야 만들어집니다. 이 파일은 DBCA로 데이터베이스를 생성할 때는 자동으로 수행되지만 CREATE DATABASE라는 명령어로 수동으로 데이터베이스를 생성 할 때는 수행되지 않음으로 수동생성해야합니다.
data dictionary view는 크게 2가지 종류가 있습니다.
하나는 static data dictionary view 다른 한가지는 dynamic prefomance view 입니다
static data dictionary view는 다시 접두어가 DBA._, ALL_, USER_로 시작되는 3가지로 나뉘고 dynamic prefomance view는 접수어가 v$로 시작되는 것들이 대표적입니다.
USER_로 시작하는 딕셔너리는 해당 사용자가 생성한 오브젝트들만 조회할 수 있다는 뜻이며 ALL_로 시작하는 딕셔너리를 해당 사용자가 생성한 오브젝트를 포함하여 해당 사용자가 접근 가능한 모든 오브젝트를 조회할 수 있습니다.
DBA_로 시작하는 딕셔너리는 데이터베이스 내의 거의 모든 오브젝트들을 다 볼 수 있지만 DBA권한을 가진 사람만이 이 딕셔너리를 조회할 수 있습니다. 
static data dictionary view는 이름의 뜻처럼 그 속에 담고 있는 내용들이 자동으로 변경되지 않고 수동으로 변경 작업을 해 주어야 한다는 뜻입니다.

CREATE TABLE st_table (no number);

BEGIN
FOR i IN 1..1000 LOOP
INSERT INTO st_table VALUES (i);
END LOOP;
COMMIT;
END;

SELECT COUNT(*) FROM st_table;

SELECT num_rows, blocks
FROM USER_TABLES
WHERE table_name='ST_TABLE';


위 과정에서 딕셔너리인 user_tables를 조회하니 st_table에 데이터가 한 건도 없는 것으로 조회됩니다. 실제 데이터는 1000건 있지만 딕셔너리 내용이 변경이 안 되어서 딕셔너리는 이 사실을 모르고 있는 것입니다.

딕셔너리를 관리자가 수동으로 업데이트한 후 다시 조회합니다.

ANALYZE TABLE st_table COMPUTE STATISTICS;

SELECT num_rows, blocks
FROM USER_TABLES 
WHERE table_name='ST_TABLE';


위 과정에서 ANALYZE 명렁어는 실제 테이블이나 인덱스, 클러스터 등을 하나씩 조사해서 그 결과를 딕셔너리에 반영시키는 명령입니다.
ANALYZE 명령어와 더불어 8i 버전 이후부터는 DBMS_STATS라는 패키지도 많이 사용하는데 이 명령어들은 해당 오브젝트들 하나씩 다 검사를 하기 때문에 오라클에 부하를 아주 많이 주게 됩니다.
그러므로 절대로 사용량이 많은 업무시간에는 해당 작업을 피하기를 권합니다. 정말 부득이한 경우 아니면 해당 명령어는 서버 사용량이 적은 시간대에 수행하기 바랍니다.

728x90