제2장 데이터 사전

내용 목차

2.1. 개요
2.2. 데이터 사전의 구조
2.2.1. 기반 테이블
2.2.2. 정적/동적 뷰
2.3. 데이터 사전의 참조
2.3.1. 일반 사용자에 의한 참조
2.3.2. SQL 파서, 질의 최적화기에 의한 참조
2.3.3. Tibero에 의한 참조
2.4. 데이터 사전의 갱신
2.4.1. DDL 문장

본 장에서는 데이터 사전에 대한 개념과 구조를 설명하고 데이터 사전의 참조 및 갱신을 기술한다.

데이터 사전(Data Dictionary)은 데이터베이스 관리 시스템(Database Management System, 이하 DBMS)을 효율적으로 사용하기 위해 데이터베이스에 저장된 정보를 요약한 것이다. 즉 일련의 데이터를 정의하고 설명해 주는 메타데이터(metadata)를 유지하는 것을 의미한다.

데이터 사전은 데이터 정보를 분류하고 처리하기 위한 시스템과 절차로서 데이터를 이해하는 과정에서 발생하는 오류, 또는 데이터 해석상의 어려움을 제거하기 위해 사용된다.

데이터 사전은 테이블과 뷰로 정의되며, 사용자 유형별로 접근 권한이 다르다.

사용자 유형설명
DBA직접 접근이 가능하며, 데이터 사전을 직접 갱신할 수 있다.
일반 사용자뷰를 통해 접근이 가능하며, 데이터 사전을 읽기만 할 수 있다.

데이터 사전에 저장되는 정보는 다음과 같다.

  • 데이터베이스 스키마 객체 정보

    테이블, 인덱스, 뷰 등이 있다.

  • 사용자 정보

    이름, 권한 등이 있다.

  • 테이블과 컬럼 속성 정보

    사용 가능한 디스크 용량, 컬럼 타입, 기본값 등이 있다.

  • 테이블의 무결성 제약조건 정보

    기본 키, 외래 키, NULL 값 허용 여부 등이 있다.

  • 디스크 구조 정보

    테이블 스페이스, 데이터 파일, 세그먼트, 사용자 및 테이블 등이 있다.

  • 히스토그램(Histogram) 정보

    주로 많이 사용되는 컬럼 값, 컬럼 값의 분포 등이 있다.

Tibero 의 데이터 사전은 크게 다음과 같이 구성된다.

  • 기반 테이블(Base Table)

  • 정적/동적 뷰

    • 정적 뷰(Static View)

    • 동적 뷰(Dynamic View)

데이터 사전을 위와 같이 분리하여 구성하는 이유는 데이터베이스 시스템의 일관성을 유지하고 사용자에게 편의성을 제공하며 데이터베이스의 저장 공간을 절약하기 위함이다. 만약 일반 사용자의 부주의로 기반 테이블의 내용을 직접 갱신하였다면, 데이터베이스 시스템에 심각한 에러를 발생시킬 수 있다.

기반 테이블은 중복된 데이터를 제거하는 정규화 과정을 거친 테이블이다. 기반 테이블 안에 일부 데이터는 플래그(Flag)로 나타나며, 암호화 되어 있다. 또한, 기반 테이블의 자체 데이터도 기반 테이블에 저장된다.

기반 테이블은 정규화를 거친 데이터가 저장되므로 중복된 데이터가 거의 존재하지 않는다. 또한, 기반 테이블은 데이터 사전을 저장하는 데 필요한 디스크 공간을 줄이며 중복된 데이터가 일관성 없이 갱신될 가능성을 사전에 예방하는 역할을 수행한다.

기반 테이블의 내용을 직접 참조할 수 있는 사용자는 오직 DBA만이 할 수 있다. 일반 사용자는 데이터 사전을 참조하는 기반 테이블의 내용을 참조하려면 정적/동적 뷰를 이용해야 한다. 왜냐하면, 모든 데이터 사전을 참조하는 기반 테이블의 소유자는 SYS 사용자이기 때문이다.

또한, 기반 테이블을 직접 갱신할 수 있는 사용자는 DBA뿐이며, 일반 사용자는 데이터 정의어(Data Definition Language, 이하 DDL) 문장을 통해서만 가능하다. DDL 문장을 실행하려면 반드시 대상 객체에 대한 DDL 문장의 실행 권한이 있어야 한다. 예를 들어 EMP 테이블의 외래 키 컬럼을 변경하려면 현재 사용자가 EMP 테이블에 대한 갱신 권한이 있어야 한다는 의미이다.

그리고 기반 테이블에 대한 관리를 데이터 사전이 함으로써 일반 사용자는 기반 테이블의 정의를 몰라도 간단한 DDL 문장으로 데이터 사전 작업을 수행할 수 있다.

예를 들어 일반 사용자가 기반 테이블을 생성 하려면 다음과 같은 순으로 정의해야 한다.

  1. 객체 정의

    기반 테이블인 _DD_OBJ 테이블에 스키마 객체를 등록한다.

  2. 테이블 정의

    기반 테이블인 _DD_TBL 테이블에 하나의 로우를 삽입한다.

  3. 컬럼 정의

    기반 테이블인 _DD_COL 테이블에 컬럼 개수에 따라 로우를 삽입한다. 만약 인덱스를 선언하였거나 제약조건을 정의한 경우, 기반 테이블에도 개수에 따라 로우를 삽입해야 한다.

Tibero에서 데이터 사전이 참조되는 경우는 다음과 같이 크게 세 가지로 나눌 수 있다.

  • 일반 사용자에 의한 참조

  • SQL 파서(Parser), 질의 최적화기에 의한 참조

  • Tibero에 의한 참조

SQL 파서

Tibero는 사용자로부터 입력된 SQL 문장을 해석할 때 데이터 사전을 이용한다. 이러한 과정을 의미 분석(Semantic Analysis) 과정이라고 부른다.

의미 분석 과정은 SQL 문장에 포함된 스키마 객체가 존재하는지, 현재 사용자가 접근할 수 있는지, 특정 테이블에 포함된 컬럼은 어떤 것이 있는지, 컬럼의 타입에 따라 맞게 연산을 실행하는지 등의 검사를 수행한다.

다음의 SQL 문장으로 의미 분석 과정을 설명한다.

SELECT C11
  FROM T1, T2
  WHERE C11 = C21 AND C22 LIKE '20%';

① SELECT 문장에 포함된 스키마 객체 즉 T1, T2가 존재하는지, 그리고 이 객체에 현재 사용자가 접근할 수 있는지 검사한다.

② 접근에 문제가 없다면, C11, C21, C22 컬럼이 T1, T2 테이블에 각각 정의되어 있는지, 아니면 동시에 T1, T2 테이블에 정의되어 있는지(또는 모호성이 존재하는지.)를 검사한다.

③ C11과 C12 컬럼이 비교 연산이 가능한지, C22 컬럼이 LIKE 연산자를 수행할 수 있는 문자열 타입인지 검사한다.

위의 SQL 문장은 의미 분석 과정을 거친 후 각 컬럼이 포함된 테이블을 명시적으로 표시하고 다음과 같이 변환된다.

SELECT T1.C11
  FROM T1, T2
  WHERE T1.C11 = T2.C21 AND T2.C22 LIKE '20%';

질의 최적화기

Tibero는 질의 최적화기를 이용하여 SQL 문장에 대한 효율적인 실행계획(Execution Plan)을 생성하기 위해 데이터 사전에 저장된 통계 정보를 참조한다.

이러한 통계 정보는 각 스키마 객체의 기반 테이블에 저장되어 있으며, 히스토그램을 저장하는 기반 테이블에도 저장되어 있다.

예를 들어 테이블 정의를 포함하는 기반 테이블에는 테이블 안에 로우의 개수, 디스크 블록의 개수, 하나의 디스크 블록에 포함된 로우의 평균 개수 등이다. 히스토그램 테이블에는 특정 컬럼에 대하여 컬럼 값의 분포, 자주 사용되는 컬럼 값 등을 저장하고 있다.

또한, 질의 최적화기는 인덱스에 대한 정보도 참조한다. 예를 들어 테이블에 어떤 컬럼이 인덱스가 생성되어 있는지, 인덱스의 단말 노드(Terminal Node)에 저장된 레코드의 평균 개수는 몇 개인지 등을 참조한다.

다음은 질의 최적화기가 어떤 데이터 사전 정보를 이용하는지 확인할 수 있는 예이다.

SELECT *
  FROM T1, T2
  WHERE T1.C1 = T2.C2;

위 예에서 보듯이 SELECT 문장은 WHERE 절의 조건에 따라 조인 연산을 수행해야 한다. 일반적으로 조인 연산은 시스템의 메모리와 CPU 시간이 많이 요구되는 연산이다. 따라서, 될 수 있으면 적은 메모리를 사용하여 조인 연산을 실행하는 방법을 찾아야 한다.

테이블 T1과 T2에 대하여 중첩 루프 조인(Nested-Loop Join)을 수행하는 방법은 다음과 같다.

  • T1을 외부 루프(Outer Loop)로 한다.

  • T2를 외부 루프로 한다.

일반적으로, 포함된 로우의 개수가 적은 테이블을 외부 루프 테이블로 하는 것이 연산 비용이 적다. 따라서, 질의 최적화기는 데이터 사전의 내용을 참조하여 테이블 T1과 T2 중에서 포함된 로우의 개수가 적은 것을 외부 루프로 하여 SQL 질의를 수행하도록 한다.

질의 최적화기가 인덱스에 대한 데이터 사전의 내용을 참조한 결과 T1.C1과 T2.C2 컬럼 모두에 대하여 인덱스가 생성되었다면, 중첩 루프 조인이 아니라, 좀 더 적은 메모리 양과 CPU 작업이 필요한 정렬 병합 조인(Sort-Merge Join) 연산을 수행한다.

데이터 사전의 갱신은 기반 테이블의 갱신을 뜻한다. 정적 뷰를 통한 갱신은 일반 사용자나 DBA도 허용되지 않으며, 동적 뷰에 대한 갱신은 자동으로 이루어지거나 다른 인터페이스를 이용해야 갱신할 수 있다. 또한, 일반 사용자는 기반 테이블에 대한 갱신을 직접 수행할 수 없다.

일반 사용자나 SYS 권한을 가진 사용자는 DDL 문장을 이용하여 안전하고 일관성 있게 데이터 사전의 내용을 갱신할 수 있다. DDL 문장을 실행하면 데이터 사전 모듈 내에서 현재 실행되고 있는 다른 트랜잭션까지 고려하여 데이터 사전의 내용을 일관성 있게 갱신해 준다.

그리고 데이터 사전의 내용과 함께 데이터베이스의 내용도 함께 갱신해야 할 경우에도 데이터 사전의 모듈 내에서 모두 수행할 수 있다.

주의

SYS 권한을 가진 사용자나 DBA만 직접 기반 테이블을 참조하고 갱신할 수 있다. 될 수 있으면 이러한 작업을 하지 않기를 권장한다.

DDL은 데이터베이스에서 데이터와 데이터 간의 관계를 정의한 SQL 문장으로 데이터베이스 구조를 설정하는 구조화된 조회 언어이다. DDL은 데이터베이스의 스키마 객체를 생성(CREATE), 갱신(ALTER), 제거(DROP) 하거나 권한의 부여나 회수(GRANT, REVOKE), 주석(COMMENT), 자료의 버림(TRUNCATE) 등을 수행하는 문장 등을 포함한다.

각 문장은 CREATE, ALTER, DROP, TRUNCATE, GRANT, REVOKE, COMMENT 등으로 시작한다. 이 밖에도 많은 종류의 DDL이 존재한다.

Tibero에서 DDL 문장을 이용하여 CREATE, ALTER, DROP할 수 있는 객체는 다음과 같다.

  • 데이터베이스

  • 테이블

  • 인덱스, 뷰, 동의어

  • 사용자

  • 무결성 제약조건

  • 역할(Role)

위 객체 중 테이블은 생성, 갱신, 삭제는 CREATE TABLE, ALTER TABLE, DROP TABLE 문을 이용하여 수행하며, 일부 객체는 생성, 갱신, 삭제 중의 일부만 가능한 경우도 있다. 예를 들어 동의어는 CREATE SYNONYM, DROP SYNONYM 문만이 존재하고, ALTER SYNONYM 문은 존재하지 않는 경우이다.

그리고 아래와 같이 객체의 생성, 갱신, 삭제와 관련 없는 특별한 목적의 DDL 문장도 존재한다.

DDL 문장설명
GRANT사용자에게 사용 권한을 부여하는 문장이다.
REVOKE사용자에게 사용 권한을 회수하는 문장이다.
SET ROLE사용자의 권한을 활성화 또는 비활성화하는 문장이다.

이와 같은 DDL 문장에 의해 갱신된 데이터 사전의 내용은 기반 테이블에 저장된다. 정적 뷰를 통해 확인할 수 있으며, 일부 내용은 동적 뷰를 통해서만 확인할 수 있다.

참고

Tibero에서 지원하는 DDL 문장에 대한 내용은 "Tibero SQL 참조 안내서"를 참고한다.