Back to Notes

Notes

DB 08. View와 System Catalog

관계 데이터베이스의 View 개념, 갱신 가능성, System Catalog와 Oracle Data Dictionary의 역할을 정리한 학습 노트

Published
Updated
Area
Databases
Type
concept
Series
Database Systems
Category
Notes
databaseviewsystem-catalogoracledata-dictionaryquery-optimization

개요

관계 데이터베이스에서 View는 기본 릴레이션으로부터 유도된 가상 릴레이션이다. 사용자는 View를 실제 테이블처럼 조회할 수 있지만, 일반적으로 View 자체가 데이터를 독립적으로 저장하는 것은 아니다. DBMS는 View의 정의를 System Catalog에서 찾아 기본 릴레이션에 대한 질의로 변환한다.

System Catalog는 데이터베이스 객체와 구조에 대한 정보를 저장하는 메타데이터 저장소이다. Oracle에서는 이를 Data Dictionary라고 부르며, 사용자는 USER_xxx, ALL_xxx, DBA_xxx 형태의 데이터 사전 View를 통해 테이블, 컬럼, View, Index, 권한, 통계 정보를 확인할 수 있다.


1. View의 핵심 개념

1.1 View는 Derived Relation이다

관계 데이터베이스에서 View는 다른 릴레이션으로부터 유도된 릴레이션이다.

구분의미
Base relation실제 데이터가 저장된 기본 릴레이션
View기본 릴레이션에 대한 SELECT문으로 정의된 가상 릴레이션
Derived relation기존 릴레이션에서 유도된 릴레이션
Virtual relation실제 테이블처럼 보이지만 독립 저장 테이블은 아닌 릴레이션

View는 ANSI/SPARC 3단계 아키텍처의 외부 View와 구분해야 한다. ANSI/SPARC의 외부 View는 특정 사용자가 바라보는 데이터베이스 전체 구조에 가깝지만, 관계 DBMS에서의 View는 하나의 가상 릴레이션을 의미한다.

1.2 View의 직관: Dynamic Window

View는 기본 릴레이션을 바라보는 **동적인 창(dynamic window)**으로 이해할 수 있다.

  • View는 SELECT문으로 정의된다.
  • 사용자는 View를 테이블처럼 조회할 수 있다.
  • 기본 릴레이션의 데이터가 변경되면 View를 통해 보이는 결과도 달라질 수 있다.
  • View는 보안, 질의 단순화, 데이터 독립성 확보에 사용된다.

예를 들어 EMPLOYEE 테이블에서 3번 부서 사원만 보여주는 View를 만들면, 사용자는 전체 EMPLOYEE 테이블을 보지 않고도 필요한 부분만 조회할 수 있다.


2. View와 Snapshot의 차이

Snapshot은 어느 시점의 SELECT 결과를 기본 릴레이션 형태로 저장한 것이다. View와 Snapshot은 모두 SELECT 결과와 관련 있지만 동작 방식이 다르다.

구분ViewSnapshot
성격동적정적
결과 저장일반적으로 저장하지 않음특정 시점의 결과를 저장
원본 변경 반영원본 변경이 조회 결과에 반영될 수 있음생성 시점의 결과를 유지
비유창문사진

View는 기본 릴레이션을 실시간으로 바라보는 창에 가깝고, Snapshot은 특정 시점의 상태를 저장해 둔 사진에 가깝다.


3. View 정의 문법

View는 CREATE VIEW문으로 정의한다.

CREATE VIEW 뷰이름 [(애트리뷰트(들))]
AS SELECT문
[WITH CHECK OPTION];

3.1 애트리뷰트 이름을 생략할 수 있는 경우

View 이름 뒤의 애트리뷰트 목록을 생략하면, SELECT절에 나열된 애트리뷰트 이름이 View의 애트리뷰트 이름으로 사용된다.

CREATE VIEW EMP_PLANNING
AS SELECT E.EMPNAME, E.TITLE, E.SALARY
FROM EMPLOYEE E, DEPARTMENT D
WHERE E.DNO = D.DEPTNO
AND D.DEPTNAME = '기획';

이 경우 View의 컬럼은 다음과 같다.

EMP_PLANNING(EMPNAME, TITLE, SALARY)

3.2 애트리뷰트 이름을 명시해야 하는 경우

다음과 같은 경우에는 View의 애트리뷰트 이름을 명시하는 것이 필요하다.

  • SELECT절에 산술식이 포함된 경우
  • SELECT절에 집단 함수가 포함된 경우
  • Join 결과에서 서로 다른 릴레이션의 애트리뷰트 이름이 중복되는 경우
  • 결과 컬럼 이름이 명확하지 않은 경우

예를 들어 부서별 평균 급여 View는 AVG(SALARY)라는 표현을 그대로 컬럼명으로 쓰기 어렵기 때문에 별도 이름을 붙인다.

CREATE VIEW EMP_AVGSAL (DNO, AVGSAL)
AS SELECT DNO, AVG(SALARY)
FROM EMPLOYEE
GROUP BY DNO;

4. 단일 릴레이션 기반 View 예제

EMPLOYEE 릴레이션에서 3번 부서에 근무하는 사원들의 사원번호, 이름, 직책만 보여주는 View를 정의할 수 있다.

CREATE VIEW EMP_DNO3 (ENO, ENAME, TITLE)
AS SELECT EMPNO, EMPNAME, TITLE
FROM EMPLOYEE
WHERE DNO = 3;

이 View의 의미는 다음과 같다.

View 컬럼원본 컬럼
ENOEMPNO
ENAMEEMPNAME
TITLETITLE

즉, EMPLOYEE 테이블 전체가 아니라 다음 조건을 만족하는 일부 데이터만 View로 제공한다.

  • 행 조건: DNO = 3
  • 열 조건: EMPNO, EMPNAME, TITLE만 포함

이 방식은 행 제한과 열 제한을 동시에 수행할 수 있기 때문에 보안과 사용자별 정보 제공에 유용하다.


5. Join 기반 View 예제

두 릴레이션을 Join해서 View를 정의할 수도 있다. 예를 들어 EMPLOYEEDEPARTMENT를 Join하여 기획부 사원의 이름, 직책, 급여만 보여주는 View를 만들 수 있다.

CREATE VIEW EMP_PLANNING
AS SELECT E.EMPNAME, E.TITLE, E.SALARY
FROM EMPLOYEE E, DEPARTMENT D
WHERE E.DNO = D.DEPTNO
AND D.DEPTNAME = '기획';

이 View는 내부적으로 다음 관계를 사용한다.

EMPLOYEE.DNO = DEPARTMENT.DEPTNO

그리고 기획부만 남기기 위해 다음 조건을 적용한다.

DEPARTMENT.DEPTNAME = '기획'

사용자는 복잡한 Join 조건을 매번 작성하지 않고도 EMP_PLANNING View를 조회할 수 있다.


6. View 조회 시 DBMS 내부 과정

사용자가 View를 조회하면 DBMS는 View 자체를 실제 테이블처럼 그대로 읽는 것이 아니라, System Catalog에서 View의 정의를 찾아 기본 릴레이션에 대한 질의로 변환한다.

예를 들어 다음 질의가 있다고 하자.

SELECT *
FROM EMP_DNO3
WHERE TITLE = '사원';

EMP_DNO3는 다음과 같이 정의되어 있다.

CREATE VIEW EMP_DNO3 (ENO, ENAME, TITLE)
AS SELECT EMPNO, EMPNAME, TITLE
FROM EMPLOYEE
WHERE DNO = 3;

DBMS는 View 질의를 기본 릴레이션 질의로 변환할 수 있다.

SELECT EMPNO, EMPNAME, TITLE
FROM EMPLOYEE
WHERE TITLE = '사원'
AND DNO = 3;

View 조회 과정은 다음 순서로 정리할 수 있다.

  1. System Catalog에서 View 정의를 검색한다.
  2. View와 기본 릴레이션에 대한 접근 권한을 검사한다.
  3. View에 대한 질의를 기본 릴레이션에 대한 동등한 질의로 변환한다.
  4. 변환된 질의를 최적화하고 실행한다.

7. View의 장점

7.1 복잡한 질의 단순화

기획부에 근무하는 사원 중 직책이 부장인 사원의 이름과 급여를 검색한다고 하자. 기본 릴레이션만 사용하면 Join 조건을 포함해야 한다.

SELECT E.EMPNAME, E.SALARY
FROM EMPLOYEE E, DEPARTMENT D
WHERE D.DEPTNAME = '기획'
AND D.DEPTNO = E.DNO
AND E.TITLE = '부장';

하지만 EMP_PLANNING View를 사용하면 질의가 간단해진다.

SELECT EMPNAME, SALARY
FROM EMP_PLANNING
WHERE TITLE = '부장';

View는 반복적으로 사용되는 복잡한 Join 조건이나 필터 조건을 감추고, 사용자에게 단순한 인터페이스를 제공한다.

7.2 데이터 무결성 보장

WITH CHECK OPTION을 사용하면 View를 통해 삽입 또는 수정되는 데이터가 View의 조건을 만족하도록 강제할 수 있다.

CREATE VIEW EMP_DNO3 (ENO, ENAME, TITLE)
AS SELECT EMPNO, EMPNAME, TITLE
FROM EMPLOYEE
WHERE DNO = 3
WITH CHECK OPTION;

이 View는 DNO = 3인 사원만 보여준다. 따라서 View를 통해 데이터를 수정한 결과가 DNO = 3 조건을 만족하지 않으면 DBMS가 갱신을 거부할 수 있다.

WITH CHECK OPTION은 View 조건을 벗어나는 삽입 또는 수정을 막는 무결성 장치로 이해하면 된다.

7.3 데이터 독립성 제공

View는 데이터베이스 내부 구조가 변경되어도 기존 응용 프로그램의 변경을 줄이는 데 사용할 수 있다.

예를 들어 기존 EMPLOYEE 릴레이션이 다음과 같다고 하자.

EMPLOYEE(EMPNO, EMPNAME, TITLE, MANAGER, SALARY, DNO)

이후 설계 변경으로 두 개의 릴레이션으로 분해되었다고 하자.

EMP1(EMPNO, EMPNAME, SALARY)
EMP2(EMPNO, TITLE, MANAGER, DNO)

기존 응용 프로그램이 계속 EMPLOYEE를 조회해야 한다면, 다음과 같이 EMPLOYEE라는 이름의 View를 정의할 수 있다.

CREATE VIEW EMPLOYEE
AS SELECT E1.EMPNO, E1.EMPNAME, E2.TITLE, E2.MANAGER,
          E1.SALARY, E2.DNO
FROM EMP1 E1, EMP2 E2
WHERE E1.EMPNO = E2.EMPNO;

이렇게 하면 내부 구조는 EMP1, EMP2로 바뀌었지만, 외부에서는 여전히 EMPLOYEE라는 릴레이션을 사용하는 것처럼 보일 수 있다.

7.4 데이터 보안 제공

View는 기본 릴레이션의 일부 애트리뷰트 또는 일부 투플만 사용자에게 보여주는 보안 메커니즘으로 사용할 수 있다.

예를 들어 EMPLOYEE 테이블에서 SALARY를 숨기고 싶다면 다음과 같은 View를 만들 수 있다.

CREATE VIEW EMP_PUBLIC AS
SELECT EMPNO, EMPNAME, TITLE, MANAGER, DNO
FROM EMPLOYEE;

그리고 사용자에게 EMPLOYEE가 아니라 EMP_PUBLIC에 대한 SELECT 권한만 부여하면 된다.

접근 대상사용자가 볼 수 있는 정보
EMPLOYEE전체 사원 정보
EMP_PUBLICSALARY를 제외한 사원 정보

7.5 동일 데이터에 대한 여러 관점 제공

같은 데이터라도 사용자 그룹마다 필요한 정보는 다르다.

사용자 그룹필요한 View 예시
일반 직원급여를 제외한 사원 정보
인사팀전체 사원 정보
부서장자기 부서 사원 정보
회계팀급여 및 비용 관련 정보

View를 사용하면 같은 기본 릴레이션을 여러 관점으로 제공할 수 있다.


8. View의 갱신 가능성

View에 대한 INSERT, UPDATE, DELETE는 결국 기본 릴레이션에 대한 갱신으로 변환되어야 한다. 하지만 모든 View가 갱신 가능한 것은 아니다.

8.1 단일 릴레이션 View의 갱신

다음 View에 데이터를 삽입한다고 하자.

INSERT INTO EMP_DNO3
VALUES (4293, '김정수', '사원');

이 삽입은 실제로는 EMPLOYEE 테이블에 대한 삽입으로 변환되어야 한다.

INSERT INTO EMPLOYEE
VALUES (4293, '김정수', '사원', ?, ?, ?);

문제는 EMP_DNO3 View에 포함되지 않은 MANAGER, SALARY, DNO 값을 어떻게 채울 것인가이다. 누락된 컬럼이 NULL을 허용하거나 기본값을 가진다면 가능할 수 있지만, NOT NULL 제약조건이 있으면 삽입이 불가능할 수 있다.

8.2 Join View의 갱신

EMP_PLANNINGEMPLOYEEDEPARTMENT를 Join해서 만든 View이다.

INSERT INTO EMP_PLANNING
VALUES ('박지선', '대리', 2500000);

이 삽입은 다음 이유로 모호하다.

  • 데이터를 EMPLOYEE에 넣어야 하는지 DEPARTMENT에 넣어야 하는지 명확하지 않다.
  • EMPLOYEE의 기본 키인 EMPNO가 View에 없다.
  • 부서번호 DNO도 View에 없기 때문에 Join 관계를 구성하기 어렵다.

따라서 Join으로 정의된 View는 일반적으로 갱신이 어렵다.

8.3 집단 함수 View의 갱신

부서별 평균 급여 View를 생각해 보자.

CREATE VIEW EMP_AVGSAL (DNO, AVGSAL)
AS SELECT DNO, AVG(SALARY)
FROM EMPLOYEE
GROUP BY DNO;

다음 갱신은 원본 데이터로 되돌리기 어렵다.

UPDATE EMP_AVGSAL
SET AVGSAL = 3000000
WHERE DNO = 2;

평균값을 3000000으로 만들기 위해 각 사원의 급여를 어떻게 바꿔야 하는지 여러 가능성이 존재하기 때문이다. 따라서 집단 함수가 포함된 View는 일반적으로 갱신할 수 없다.


9. 갱신이 불가능한 View의 대표 조건

조건갱신이 어려운 이유
기본 키가 포함되지 않은 View원본 투플을 식별하기 어렵다
View에 포함되지 않은 컬럼이 NOT NULL인 경우삽입 시 필수 값을 제공할 수 없다
집단 함수가 포함된 View집계 결과를 원본 행으로 역변환할 수 없다
Join으로 정의된 View여러 테이블 중 어느 쪽을 어떻게 갱신할지 모호하다

주의할 점은 이론적으로 갱신 가능한 View상용 DBMS가 실제로 갱신을 허용하는 View가 항상 일치하지는 않는다는 것이다. DBMS 구현 정책에 따라 더 엄격하게 제한될 수 있다.


10. System Catalog의 개념

System Catalog는 데이터베이스 객체와 구조에 관한 정보를 저장한다.

저장 정보예시
사용자 정보사용자 이름, 소유 객체
릴레이션 정보테이블 이름, 소유자, 투플 수
애트리뷰트 정보컬럼 이름, 타입, 길이
View 정보View 이름, View 정의 SQL
Index 정보인덱스 이름, 대상 컬럼, 통계
권한 정보누가 어떤 객체에 접근 가능한지

System Catalog는 Metadata라고도 부른다. Metadata는 “데이터에 관한 데이터”라는 뜻이다.

예를 들어 EMPLOYEE 테이블의 실제 데이터가 사원 목록이라면, System Catalog는 다음과 같은 정보를 저장한다.

EMPLOYEE 테이블이 존재한다.
EMPLOYEE 테이블의 소유자는 KIM이다.
EMPLOYEE 테이블에는 EMPNO, EMPNAME, TITLE, MANAGER, SALARY, DNO 컬럼이 있다.
EMPNO는 기본 키이다.
DNO는 외래 키이다.

System Catalog는 Data Dictionary 또는 System Table이라고도 부른다.


11. System Catalog가 질의 처리에 사용되는 방식

사용자가 다음 질의를 실행한다고 하자.

SELECT EMPNAME, SALARY, SALARY * 1.1
FROM EMPLOYEE
WHERE TITLE = '과장' AND DNO = 2;

DBMS는 이 질의를 실행하기 전에 System Catalog를 이용해 여러 검사를 수행한다.

11.1 문법 검사

먼저 SELECT, FROM, WHERE 구조가 SQL 문법에 맞는지 검사한다.

11.2 릴레이션 존재 여부 검사

FROM EMPLOYEE에서 참조한 EMPLOYEE 릴레이션이 실제로 존재하는지 확인한다.

11.3 애트리뷰트 존재 여부 검사

다음 애트리뷰트들이 EMPLOYEE 릴레이션에 존재하는지 확인한다.

EMPNAME
SALARY
TITLE
DNO

11.4 데이터 타입 검사

SALARY * 1.1은 산술 연산이므로 SALARY가 숫자형인지 확인한다.

SALARY * 1.1

TITLE = '과장'은 문자열 비교이므로 TITLE이 문자형인지 확인한다.

TITLE = '과장'

11.5 권한 검사

사용자가 EMPLOYEE 릴레이션의 EMPNAME, SALARY 애트리뷰트를 조회할 권한이 있는지 확인한다.

11.6 인덱스 확인

WHERE절에서 사용된 TITLE, DNO에 인덱스가 있는지 확인한다.

WHERE TITLE = '과장' AND DNO = 2

12. Query Optimization과 통계 정보

Query Optimization은 DBMS가 질의를 수행하는 여러 방법 중 가장 비용이 적게 드는 방법을 찾는 과정이다.

같은 SQL도 여러 방식으로 실행될 수 있다.

실행 방법설명
Full table scan테이블 전체를 순차적으로 읽음
TITLE index 사용TITLE = '과장' 조건을 먼저 적용
DNO index 사용DNO = 2 조건을 먼저 적용
복수 index 조합두 조건의 index를 함께 활용

DBMS가 적절한 실행 계획을 선택하려면 System Catalog에 저장된 통계 정보가 정확해야 한다.

12.1 Selectivity

Selectivity는 조건이 전체 투플 중 얼마나 많은 투플을 선택하는지 나타낸다.

Selectivity = 조건을 만족하는 투플 수 / 전체 투플 수

선택율이 낮을수록 조건이 더 강하게 데이터를 걸러내며, 인덱스 사용 효과가 커질 가능성이 높다.

예를 들어 EMPLOYEE에 7개의 투플이 있고, TITLE에는 5가지 값, DNO에는 3가지 값이 있다고 하자.

애트리뷰트상이한 값 개수
TITLE5
DNO3

일반적으로 상이한 값의 개수가 많은 TITLE 조건이 검색 대상을 더 좁힐 가능성이 높다. 따라서 TITLE 인덱스가 DNO 인덱스보다 유리할 수 있다.


13. System Catalog의 저장 방식과 갱신 제한

관계 DBMS의 System Catalog는 사용자 릴레이션과 유사한 형태로 저장된다. 따라서 SELECT문으로 내용을 조회할 수 있다.

예를 들어 단순화된 System Catalog는 다음과 같이 구성될 수 있다.

13.1 SYS_RELATION

SYS_RELATION은 릴레이션에 관한 정보를 저장한다.

컬럼의미
RelId릴레이션 이름
RelOwner소유자
RelTuples투플 수
RelAtts애트리뷰트 수
RelWidth투플 길이

13.2 SYS_ATTRIBUTE

SYS_ATTRIBUTE는 애트리뷰트에 관한 정보를 저장한다.

컬럼의미
AttRelId애트리뷰트가 속한 릴레이션
AttID애트리뷰트 번호
AttName애트리뷰트 이름
AttOffset투플 내 시작 위치
AttType데이터 타입
AttLen애트리뷰트 길이
PkorFk기본 키 또는 외래 키 여부

13.3 사용자는 System Catalog를 직접 갱신할 수 없다

System Catalog는 데이터베이스 구조의 기준이 되는 정보이므로 사용자가 직접 INSERT, UPDATE, DELETE할 수 없다.

예를 들어 EMPLOYEE에서 MANAGER 컬럼을 삭제하려면 다음과 같은 DDL을 사용해야 한다.

ALTER TABLE EMPLOYEE DROP COLUMN MANAGER;

System Catalog를 직접 삭제하려는 다음 방식은 허용되지 않는다.

DELETE FROM SYS_ATTRIBUTE
WHERE AttRelId = 'EMPLOYEE' AND AttName = 'MANAGER';

DBMS는 DDL 수행 결과에 따라 System Catalog를 자동으로 갱신한다.


14. System Catalog에 유지되는 통계 정보

System Catalog에는 질의 최적화를 위해 다양한 통계 정보가 저장된다.

14.1 릴레이션마다 유지되는 정보

정보의미
투플 크기한 행이 차지하는 크기
투플 수전체 행 수
각 블록의 채우기 비율저장 블록 사용률
블록킹 인수한 블록에 저장 가능한 투플 수
릴레이션 크기릴레이션이 차지하는 블록 수

14.2 View마다 유지되는 정보

정보의미
View 이름View 식별자
View 정의View를 정의한 SELECT

14.3 애트리뷰트마다 유지되는 정보

정보의미
데이터 타입int, char, varchar
크기저장 길이
상이한 값 개수distinct value 수
값의 범위최솟값, 최댓값 등
선택율조건 만족 투플 수 / 전체 투플 수

14.4 사용자마다 유지되는 정보

정보의미
접근 가능한 릴레이션사용자가 조회 또는 조작 가능한 객체
권한SELECT, INSERT, UPDATE, DELETE

14.5 인덱스마다 유지되는 정보

정보의미
인덱스된 애트리뷰트인덱스 대상 컬럼
키/비키 여부Key attribute인지 여부
클러스터링 여부Clustering index인지 여부
밀집/희소 여부Dense/Sparse index 여부
인덱스 높이탐색 단계 수
1단계 인덱스 블록 수인덱스 저장 구조 정보

15. Oracle Data Dictionary

Oracle에서는 System Catalog를 Data Dictionary라고 부른다.

항목내용
명칭Data Dictionary
저장 위치System tablespace
구성기본 테이블 + Data Dictionary View
일반 사용자 접근주로 Data Dictionary View를 통해 접근

Oracle의 기본 테이블에는 내부 정보가 저장되어 있으므로, 일반 사용자는 보통 이해하기 쉬운 형태로 제공되는 Data Dictionary View를 조회한다.


16. Oracle Data Dictionary View의 세 부류

Oracle의 Data Dictionary View는 크게 DBA_xxx, ALL_xxx, USER_xxx로 나뉜다.

View 종류범위설명
DBA_xxx가장 넓음데이터베이스 내 모든 객체 정보
ALL_xxx중간현재 사용자가 접근할 수 있는 객체 정보
USER_xxx가장 좁음현재 사용자가 소유한 객체 정보

포함 관계는 다음과 같다.

DBA_xxx
└── ALL_xxx
    └── USER_xxx

구분 기준은 다음처럼 정리할 수 있다.

USER_xxx = 내가 소유한 객체
ALL_xxx = 내가 접근 가능한 객체
DBA_xxx = DB 전체 객체

17. 주요 Oracle Data Dictionary View

View용도
ALL_CATALOG접근 가능한 테이블, View, Synonym 정보
ALL_CONSTRAINTS접근 가능한 제약조건 정보
ALL_CONS_COLUMNS제약조건에 포함된 컬럼 정보
ALL_TABLES접근 가능한 테이블 정보
ALL_VIEWS접근 가능한 View 정보
DICTIONARY 또는 DICTData Dictionary View 목록
TABLE_PRIVILEGES객체 권한 정보
USER_CATALOG사용자가 소유한 테이블, View, Synonym 정보
USER_TAB_COLUMNS사용자의 테이블과 View에 속한 컬럼 정보
USER_VIEWS사용자가 소유한 View 정보
USER_INDEXES사용자가 소유한 Index 정보
USER_IND_COLUMNS사용자가 소유한 Index의 컬럼 정보
USER_CONSTRAINTS사용자가 소유한 제약조건 정보

18. Oracle Data Dictionary 조회 예제

18.1 ALL_CATALOG: 접근 가능한 테이블과 View 조회

SELECT *
FROM ALL_CATALOG
WHERE OWNER = 'KIM';
컬럼의미
OWNER객체 소유자
TABLE_NAME테이블 또는 View 이름
TABLE_TYPE객체 유형

18.2 USER_TAB_COLUMNS: 테이블 컬럼 정보 조회

SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'EMPLOYEE';

USER_TAB_COLUMNS를 통해 확인할 수 있는 정보는 다음과 같다.

  • 컬럼 이름
  • 데이터 타입
  • 컬럼 길이
  • NULL 허용 여부
  • Default 값

18.3 USER_VIEWS: View 정의 조회

SELECT VIEW_NAME, TEXT
FROM USER_VIEWS;
컬럼의미
VIEW_NAMEView 이름
TEXTView를 정의한 SQL문

이 정보는 View 조회 시 DBMS가 View 정의를 찾아 기본 릴레이션 질의로 변환하는 과정과 연결된다.


19. Oracle에서 Join View 갱신 예제

EMP_PLANNINGEMPLOYEEDEPARTMENT를 Join해서 정의한 View이다.

INSERT INTO EMP_PLANNING
VALUES ('김지민', '사원', 1500000);

이 삽입은 다음 이유로 실패할 수 있다.

  • EMPLOYEE의 기본 키인 EMPNO가 View에 포함되어 있지 않다.
  • DNO가 없기 때문에 DEPARTMENT와의 Join 관계를 구성하기 어렵다.
  • Join View이므로 어떤 기본 테이블을 어떻게 갱신해야 하는지 모호하다.

이 예제는 View 갱신 가능성의 제한을 보여준다.


20. Oracle Index와 통계 정보

20.1 Index 생성

EMPLOYEE 테이블의 DNO 컬럼에 Index를 생성한다.

CREATE INDEX EMPDNO_IDX ON EMPLOYEE(DNO);

20.2 USER_INDEXES: Index 통계 조회

SELECT INDEX_NAME, INITIAL_EXTENT, DISTINCT_KEYS,
       NUM_ROWS, SAMPLE_SIZE, LAST_ANALYZED
FROM USER_INDEXES
WHERE INDEX_NAME = 'EMPDNO_IDX';
컬럼의미
INDEX_NAMEIndex 이름
INITIAL_EXTENT초기 Extent 크기
DISTINCT_KEYS서로 다른 Index key 개수
NUM_ROWS통계상 행 수
SAMPLE_SIZE통계 분석에 사용된 표본 수
LAST_ANALYZED마지막 통계 분석 시점

예시 상태는 다음처럼 해석할 수 있다.

DISTINCT_KEYS = 3
NUM_ROWS = 7
SAMPLE_SIZE = 7

DISTINCT_KEYS = 3DNO 값의 종류가 3개라는 뜻이다.


21. 통계 정보는 즉시 갱신되지 않을 수 있다

EMPLOYEE 테이블에 새로운 투플을 삽입한다고 하자.

INSERT INTO EMPLOYEE
VALUES (3428, '김지민', '사원', 2106, 1500000, 2);

실제 행 수는 증가하지만, USER_INDEXES의 통계 정보가 즉시 변경되지 않을 수 있다.

시점실제 행 수통계상 NUM_ROWS설명
삽입 전77실제 데이터와 통계 일치
삽입 직후87통계 정보가 아직 갱신되지 않음
ANALYZE88통계 정보 갱신

주의할 점은 Optimizer가 통계 정보를 기반으로 실행 계획을 선택한다는 것이다. 통계 정보가 오래되면 실제 데이터 분포와 맞지 않는 실행 계획을 선택할 수 있다.


22. ANALYZE로 통계 정보 갱신

Index 통계 정보를 갱신하려면 다음 명령을 사용할 수 있다.

ANALYZE INDEX EMPDNO_IDX
COMPUTE STATISTICS;

일반 문법은 다음과 같다.

ANALYZE 객체_유형 객체_이름 연산 STATISTICS;
요소예시의미
객체 유형TABLE, INDEX분석 대상 종류
객체 이름EMPDNO_IDX분석 대상 이름
연산COMPUTE, ESTIMATE통계 계산 방식
STATISTICSSTATISTICS통계 정보 대상

22.1 COMPUTEESTIMATE

연산의미특징
COMPUTE전체 데이터를 접근하여 통계 계산정확하지만 비용이 큼
ESTIMATE표본을 사용하여 통계 추정빠르지만 정확도가 낮을 수 있음

대량의 데이터를 삽입, 삭제, 수정한 뒤에는 통계 정보가 실제 데이터와 달라질 수 있으므로 ANALYZE 작업이 필요할 수 있다.


23. USER_IND_COLUMNS: Index 대상 컬럼 확인

USER_IND_COLUMNS는 Index가 어떤 테이블의 어떤 컬럼에 정의되어 있는지 보여준다.

SELECT *
FROM USER_IND_COLUMNS
WHERE TABLE_NAME = 'EMPLOYEE';
컬럼의미
INDEX_NAMEIndex 이름
TABLE_NAMEIndex가 정의된 테이블
COLUMN_NAMEIndex가 정의된 컬럼
COLUMN_POSITION복합 Index에서 컬럼 순서
COLUMN_LENGTH컬럼 길이
DESCEND정렬 방향

24. Oracle의 자동 Index 생성

Oracle은 특정 제약조건을 정의하면 자동으로 Index를 생성할 수 있다.

컬럼조건Index 생성 방식
EMPNOPRIMARY KEYOracle이 자동 생성
EMPNAMEUNIQUEOracle이 자동 생성
DNO사용자가 CREATE INDEX 수행사용자 명시 생성

기본 키와 UNIQUE 제약조건은 중복 여부를 빠르게 검사해야 하므로 DBMS가 내부적으로 Index를 생성할 수 있다.


25. 자칫 실수하기 쉬운 부분

25.1 View와 Snapshot을 혼동하지 않기

구분핵심
View원본 릴레이션을 동적으로 바라보는 가상 릴레이션
Snapshot특정 시점의 결과를 저장한 정적 릴레이션

25.2 View는 항상 갱신 가능한 것이 아니다

다음 조건이 있으면 갱신이 제한될 수 있다.

  • 기본 키가 포함되지 않음
  • NOT NULL 컬럼이 View에 없음
  • 집단 함수 포함
  • Join으로 정의됨

25.3 System Catalog는 직접 수정하지 않는다

System Catalog는 사용자가 직접 DELETE, UPDATE, INSERT로 수정하는 대상이 아니다. 테이블 구조 변경은 DDL로 수행해야 한다.

ALTER TABLE EMPLOYEE DROP COLUMN MANAGER;

25.4 통계 정보와 실제 데이터는 다를 수 있다

데이터가 변경되어도 Data Dictionary의 통계 정보가 즉시 갱신되지 않을 수 있다. Query Optimizer가 정확한 판단을 하려면 최신 통계가 필요하다.


26. 핵심 요약

주제핵심
View기본 릴레이션에 대한 SELECT문으로 정의되는 가상 릴레이션
Snapshot특정 시점의 SELECT 결과를 저장한 릴레이션
WITH CHECK OPTIONView 조건을 만족하지 않는 삽입/수정을 방지
View 장점질의 단순화, 무결성, 데이터 독립성, 보안, 다양한 관점 제공
갱신 불가능 View기본 키 없음, NOT NULL 누락, 집단 함수, Join View
System CatalogDB 객체와 구조에 대한 Metadata 저장소
Query Optimization가장 비용이 적은 실행 방법을 선택하는 과정
Selectivity조건 만족 투플 수 / 전체 투플 수
Oracle Data DictionaryOracle의 System Catalog
DBA_xxxDB 전체 객체 정보
ALL_xxx현재 사용자가 접근 가능한 객체 정보
USER_xxx현재 사용자가 소유한 객체 정보
USER_INDEXESIndex 통계 정보
USER_IND_COLUMNSIndex가 걸린 컬럼 정보
ANALYZE통계 정보 갱신 명령

8장의 전체 흐름은 다음처럼 정리할 수 있다.

View
→ View 정의는 System Catalog에 저장됨
→ DBMS는 System Catalog를 이용해 View 질의를 기본 릴레이션 질의로 변환
→ System Catalog의 통계 정보는 Query Optimization에 활용됨
→ Oracle에서는 System Catalog를 Data Dictionary View로 조회함