본문 바로가기

SQL + PL/SQL/SQL

VIEW - 뷰

VIEW


쉽게 말해 가상 테이블

데이터가 들어있지 않음, view 테이블에 사용자가 명령어로 접근했을 때 해당하는 데이터를 원본에서 갖고 온다.

이유? 보안 + 편의성


원하는 칼럼만 뽑아내서 새로운 가상 테이블을 만드는것이 VIEW 

그럼 CTAS (똑같은 칼럼과 데이터를 가진 테이블을 복사해서 생성)로도 만들 수 있지 않나염?

당근 만들수는 있다. 하지만 문제는

CTAS는 원본 테이블에서 UPDATE 즉, 데이터가 변경될 경우 복사된 테이블에는 데이터 내용이 바뀌지 않는다.

VIEW 같은 경우는 데이터를 가지고 있지 않고 사용자가 접근했을 때 원본테이블로 가서 해당 데이터들을 가져오기 때문에

변경된 내용도 반영이 되어 가져올 수 있음.

가져오고 나서 사용자에게 보여주고 데이터를 삭제함.


VIEW의 주요 용도는 조회


** 

SYS 계정에서 SCOTT 계정한테 CREATE VIEW 권한부여 해줘야함

SYS>grant create view to scott ;

**





1. Simple View (단순 View)


서브 쿼리에 조인 조건이 안들어가고 1개의 테이블로 만들어지는 간단한 View

그니까 join 없이 생성된 간단한 뷰


문법: 

CREATE OR REPLACE (FORCE/NOFORCE) VIEW view이름

AS 

서브쿼리 

WITH CHECK OPTION 제약조건

WITH READ ONLY


문법설명:

OR REPLACE --> 같은 이름의 VIEW가 있을 경우 삭제 후 다시 생성 (써도되고 안써도 되고)

FORCE --> 기본 테이블의 존재 여부에 상관 없이 VIEW 생성

NOFORCE --> 기본 테이블이 존재할 경우에만 VIEW 생성 (FORCE/NOFORCE 도 써도 되고 안써도되고)

WITH CHECK OPTION --> 주어진 제약조건에 맞는 데이터만 입력 및 수정 허용

WITH READ ONLY --> SELECT만 가능한 읽기 전용 VIEW



다 만들고 확인방법은

SELECT * FROM 뷰이름

VIEW 생성할 때 써놓았던 서브쿼리 부분이 실행되면서 칼럼들이 나타나면 된다.


단순+복합VIEW에서는 제약조건이나 인덱스를 생성 할 수 가 없음 

WHY? 당연히 데이터가 없으니까...



2. Complex View (복합 View)


서브쿼리에 여러개의 테이블이 JOIN 되어 생성됨

그니까 join으로 뷰 생성

문법은 Simple View랑 똑같지만 서브쿼리에서 조인 문법을 써서 여러개의 테이블을 묶어줌



3. Inline View (인라인 View)

단순/복합 뷰는 하나 만들어 놓고 여러사람이나 여러 SQL이 쓰는 뷰

인라인 뷰는 하나의 sql에서만 쓰고 안씀 즉, 일회용 view 를 Inline View 라고 함

FROM 절에 VIEW의 서브쿼리 부분을 바로 적어주면서 가상 테이블을 일회용으로 만드는 것


예로 그림




4. Materialized View (MVIEW)

데이터를 가지고 있는 특수한 VIEW


기본방식의 view는 많은 사용자들이 대용량 데이터를 view를 통해 사용할 경우 

계속 왔다 갔다 지웠다가 가져왔다가 해서 속도 느리고, 부하도 많이 걸림


데이터를 지우지 않고 가지고 있는 뷰를 MVIEW라고 함

그래서 사용자가 많고 데이터가 많을수록 MVIEW를 사용해서 효율과 성능 UP!


엠뷰는 데이터가 존재하기 때문에 INDEX도 생성 가능함


문제점은 원본 테이블의 데이터와 MVIEW 데이터간의 동기화 문제!

원본 테이블에서 UPDATE를 했을때 MVIEW에서의 데이터도 변경되어야 하는데 그게 가능한가?

방법은 두가지

1) 원본테이블에서 데이터 내용을 바꾸고 COMMIT을 했을 때 MVIEW도 바로 바뀌는 방법 --> ON COMMIT

2) 관리자가 수동으로 바꿔주는 방법 --> ON DEMAND




** SYS로 접속한 후 SCOTT 계정에 

QUERY REWRITE와 CREATE MATERIALIZED VIEW 권한 부여해주기

SYS>grant query rewrite to scott ;

SYS>grant create materialized view to scott ;



생성방법


문법: 

CREATE MATERIALIZED VIEW 엠뷰이름

BUILD IMMEDIATE

REFRESH

ON DEMAND

COMPLETE

ENABLE QUERY REWRITE

AS

서브쿼리


문법설명:

BUILD IMMEDIATE --> MVIEW 생성하면서 서브쿼리 부분을 수행해 데이터를 가져와라

REFRESH (ON DEMAND/ON COMMIT) (COMPLETE/FAST/FORCE/NEVER)

--> ON DEMAND와 ON COMMIT 의 차이 

ON DEMAND: 직접 수동으로 바꿔주는 방법

ON COMMIT: 원본테이블에서 데이터 내용을 바꾸고 COMMIT을 했을 때 MVIEW도 바로 바뀌는 방법 --> 

--> COMPLETE/FAST/FORCE/NEVER

REFRESH를 하는 방법들

COMPLETE는 엠뷰의 데이터 전체가 원본 테이블과 동기화 되는 옵션, 데이터량이 많으면 시간도 많이 소요됨

FAST는 원본 테이블에 new date가 입력되면 그부분만 엠뷰로 동기화됨

FORCE는 FAST 방법이 가능하면 FAST로 하고, 불가능 하면 COMPLETE 방법을 사용해서 동기화됨

NEVER는 동기화 안함



조회방법

사용되는 딕셔너리는 USER_MVIEWS (데이터베이스 내의 모든 엠뷰 조회는 DBA_MVIEWS)


문법:

SELECT MVIEW_NAME, QUERY

FROM USER_MVIEWS

WHERE MVIEW_NAME='엠뷰이름대문자'




ON DEMAND를 사용해 수동으로 동기화 하는 방법


문법: 

BEGIN

동기화 명령어

END ;

/


동기화 명령어 종류 

DBMS_MVIEW.REFRESH ('엠뷰이름') ;

엠뷰이름에 해당하는 엠뷰를 동기화 

DBMS_MVIEW.REFRESH_DEPENDENT ('ABC') ;

ABC 테이블을 사용하고 있는 모든 엠뷰를 찾아 한꺼번에 동기화

DBMS_MVIEW.REFRESH_ALL_MVIEWS ;

해당 사용자가 만든 모든 엠뷰를 동기화



예로 그림




'SQL + PL/SQL > SQL' 카테고리의 다른 글

SYNONYM  (0) 2013.01.13
SEQUENCE - 시퀀스  (0) 2013.01.13
INDEX - 인덱스  (0) 2013.01.13
CONSTRAINT - 제약조건  (0) 2013.01.13
DDL  (0) 2013.01.13