본문 바로가기

DEVELOPMENT/SQL

[SQL] 뷰(VIEW)

뷰(VIEW)

 

데이터베이스 객체란 테이블이나 인덱스 등 데이터베이스 안에 정의하는 모든 것을 말한다. 뷰 역시 데이터베이스 객체 중 하나이다. 반면 SELECT 명령은 객체가 아니다. SELECT 명령에 이름을 지정할 수도 없고 데이터베이스에 등록되지도 않기 때문이다.

이처럼 본래 데이터베이스 객체로 등록할 수 없는 SELECT 명령을, 객체로서 이름을 붙여 관리할 수 있도록 한 것이 뷰이다. SELECT 명령은 실행했을 때 테이블에 저장된 데이터를 결괏값으로 반환한다. 따라서 뷰를 참조하면 그에 정의된 SELECT 명령의 실행결과를 테이블처럼 사용할 수 있다.

뷰를 작성하는 것으로 복잡한 SELECT 명령을 간략하게 표현할 수 있다.

 

뷰는 테이블처럼 취급할 수 있지만 '실체가 존재하지 않는다'라는 의미로 '가상 테이블'이라 불리기도 한다. 

SELECT 명령으로 이루어지는 뷰는 테이블처럼 데이터를 쓰거나 지울 수 있는 저장공간을 가지지 않는다. 이 때문에 테이블처럼 취급할 수 있다고는 해도 SELECT 명령에서만 사용하는 것을 권장한다.

INSERT나 UPDATE, DELETE 명령에서도 조건이 맞으면 가능하지만 사용에 주의할 필요가 있다.

 

 

뷰 작성

 

*CREATE VIEW

-- 형식
CREATE VIEW 뷰명 AS SELECT 명령

-- 예시
CREATE VIEW sample_view AS SELECT * FROM sample1;
SELECT * FROM sample_view;

 

*CREATE VIEW에서 열 지정하기

-- 형식
CREATE VIEW 뷰명 (열명1, 열명2, ...) AS SELECT 명령

-- 예시
CREATE VIEW sample_view(n, v, v2) AS SELECT no, a, a*2 FROM sample1;
SELECT * FROM sample_view WHERE n = 1;

 

 

뷰 삭제

 

-- 형식
DROP VIEW 뷰명

-- 예시
DROP VIEW sample_view;

 

 

뷰의 약점

 

뷰는 데이터베이스 객체로서 저장장치에 저장된다. 하지만 테이블과 달리 대량의 저장공간을 필요로 하지 않는다. 데이터베이스에 저장되는 것은 SELECT 명령뿐이기 때문이다.

다만 저장공간을 소비하지 않는 대신 CPU 자원을 사용한다. 검색뿐만 아니라 ORDER BY로 정렬하거나 GROUP BY로 집계하는 처리는 계산능력을 필요로 하기 때문에 컴퓨터의 CPU를 사용한다.

 

1. 머티리얼라이즈드 뷰(Materialized View)

뷰의 근원이 되는 테이블에 보관하는 데이터양이 많은 경우, 집계처리를 할 때도 뷰가 사용된다면 처리속도가 많이 떨어질 수밖에 없다. 뷰를 중첩해서 사용하는 경우에도 처리 속도가 떨어지기 쉽다.

이 같은 상황을 회피하기 위해 사용할 수 있는 것이 머티리얼라이즈드 뷰이다. 일반적으로 뷰는 데이터를 일시적으로 저장했다가 쿼리가 실행 종료될 때 함께 삭제되지만 머티리얼라이즈드 뷰는 처음 참조되었을 때 테이블처럼 데이터를 저장장치에 저장해두고 사용한다. 

뷰에 지정된 테이블의 데이터가 자주 변경되지 않는 경우라면 머티리얼라이즈드 뷰를 사용하여 뷰의 약점을 어느 정도 보완할 수 있다. 다만, Oracle과 DB2에서만 사용할 수 있는 데이터베이스 객체이다.

 

2. 함수 테이블

부모 쿼리와 연관된 서브쿼리의 경우에는 뷰의 SELECT 명령으로 사용할 수 없는데, 이 같은 뷰의 약점을 함수 테이블을 사용하여 보완할 수 있다.

함수 테이블은 테이블을 결괏값으로 반환해주는 사용자정의 함수이다. 함수에는 인수를 지정할 수 있기 때문에 인수의 값에 따라 WHERE 조건을 붙여 결괏값을 바꿀 수 있다. 그에 따라 상관 서브쿼리처럼 동작할 수 있다.

 

 

 

'DEVELOPMENT > SQL' 카테고리의 다른 글

[SQL] 인덱스  (0) 2023.05.31
[SQL] 제약조건  (0) 2023.05.30
[SQL] 테이블 작성/삭제/변경  (0) 2023.05.30
[SQL] 상관 서브쿼리  (0) 2023.05.30
[SQL] 서브쿼리  (0) 2023.05.30