[DBMS_Oracle] 뷰 2

뷰 2


1. 뷰의 내부구조와 USER_VIEWS 데이터 딕셔너리

- 뷰는 물리적으로 데이터를 저장하고 있지 않다고 하였습니다. 그런데도 다음과 같은 질의 문을 수행할 수 있는 이유가 무엇일까요?

SELECT * FROM EMP_VIEW30;


- EMP_VIEW30라는 뷰는 데이터를 물리적으로 저장하고 있지 않습니다. 

- CREATE VIEW 명령어로 뷰를 정의할 때 AS 절 다음에 기술한 쿼리 문장 자체를 저장하고 있습니다. 

- 뷰 정의할 때 기술한 쿼리문이 궁금하다면 데이터 딕셔너리 USER_VIEWS 테이블의 TEXT 컬럼 값을 살펴보면 됩니다. 

- USER_VIEWS에서 테이블 이름과 텍스트만 출력해 보겠습니다.

SELECT VIEW_NAME, TEXT

FROM USER_VIEWS;


- 기본 테이블은 디스크 공간을 할당 받아서 실질적으로 데이터를 저장하고 있지만, 뷰는 데이터 딕셔너리USER_VIEWS 에 사용자가 뷰를 정의할 때 기술한 서브 쿼리문(SELECT 문)만을 문자열 형태로 저장하고 있습니다. 


뷰의 동작 원리를 이해하기 위해서 뷰에 대한 질의가 어떻게 내부적으로 처리되는지 자세히 살펴보도록 합시다.

1) 사용자가 뷰에 대해서 질의를 하면 USER_VIEWS에서 뷰에 대한 정의를 조회합니다.

2) 기본 테이블에 대한 뷰의 접근 권한을 살핀다.

3) 뷰에 대한 질의를 기본 테이블에 대한 질의로 변환합니다.

4) 기본 테이블에 대한 질의를 통해 데이터를 검색합니다.

5) 검색된 결과를 출력합니다.


- 우리가 앞에서 생성한 뷰인 EMP_VIEW30를 SELECT문의 FROM절 다음에 기술하여 질의를 하면 오라클 서버는 USER_VIEWS에서 EMP_VIEW30를 찾아 이를 정의할 때 기술한 서브 쿼리문이 저장된 TEXT 값을 EMP_VIEW30 위치로 가져갑니다. 


- 질의는 기본 테이블인 EMP_COPY를 통해 일어납니다. 즉, 기본 테이블인 EMP_COPY 에 대해서 서브 쿼리문을 수행하게 됩니다. 이러한 동작 원리 덕분에 뷰가 실질적으로 데이터를 저장하고 있지 않더라도 데이터를 검색할 수 있는 것입니다. 


(1) 실습 [뷰와 기본 테이블 관계 파악하기]

기본 테이블을 가져다가 쿼리문을 수행한다는 것을 증명하기 위해서 간단한 예를 살펴보도록 하겠습니다. 

1) 다음은 EMP_VIEW30 뷰에 행을 하나 추가하는 문장입니다. 

INSERT INTO EMP_VIEW30

VALUES(1111, 'AAAA', 30);


2) INSERT 문으로 뷰에 새로운 행을 추가하였습니다. 뷰의 내용을 출력해 보면 추가된 행이 뷰에 존재하고 있음을 확인할 수 있습니다. 

SELECT * FROM EMP_VIEW30;


3) 뷰 뿐만 아니라 기본 테이블의 내용을 출력해 보면 INSERT 문에 의해서 뷰에 추가한 행이 테이블에도 존재함을 확인할 수 있습니다. 

SELECT * FROM EMP_COPY;


- INSERT 문에 뷰(EMP_VIEW30)를 사용하였지만, 뷰는 쿼리문에 대한 이름일 뿐이기 때문에 새로운 행은 기본 테이블(EMP_COPY)에 실질적으로 추가되는 것임을 알 수 있습니다. 뷰(EMP_VIEW30)의 내용을 확인하기 위해 SELECT문을 수행하면 변경된 기본 테이블(EMP_COPY)의 내용에서 일부를 서브 쿼리한 결과를 보여줍니다. 

- 뷰는 실질적인 데이터를 저장한 기본 테이블을 볼 수 있도록 한 투명한 창입니다, 기본 테이블의 모양이 바뀐 것이고 그 바뀐 내용을 뷰라는 창을 통해서 볼 뿐입니다. 뷰에 INSERT 뿐만 아니라 UPDATE, DELETE 모두 사용할 수 있는데, UPDATE, DELETE 쿼리문 역시 뷰의 텍스트에 저장되어 있는 기본 테이블이 변경하는 것입니다. 

- 이 정도면 뷰가 물리적인 테이블을 근거로 한 논리적인 가상 테이블이란 말의 의미를 이해할 수 있으리라고 생각됩니다. 


'Server > DBMS' 카테고리의 다른 글

[DBMS_Oracle] CASE..WHEN...THEN  (0) 2014.12.16
[DBMS_Oracle] 뷰 3  (0) 2014.12.15
[DBMS_Oracle] 뷰 1  (0) 2014.12.15
[DBMS_MySQL] MySQL 설치 및 사용자 추가,권한  (0) 2014.12.13
[DBMS_Oracle] 인덱스  (0) 2014.12.10