SQL : View - 뷰 작성과 삭제

30강 뷰 작성과 삭제

뷰는 테이블과 같은 부류의 데이터베이스 객체 중 하나이다.

CREATE VIEW 뷰명 AS SELECT 명령
DROP VIEW 뷰명

서브쿼리는 FROM 구에서도 기술할 수 있다. 여기서 FROM 구에 기술된 서브쿼리에 이름을 붙이고 데이터베이스 객체화하여 쓰기 쉽게 한 것을 뷰라고 한다.

데이터베이스 객체란 테이블이나 인덱스 등 데이터베이스 안에 정의하는 모든 것을 말한다. 뷰 역시 데이터베이스 객체 중 하나이다. 반면 SELECT 명령은 실행했을 때 테이블에 저장된 데이터를 결괏값으로 반환한다.

즉, 뷰를 참조하면 그에 정의된 SELECT 명령의 실행결과를 테이블처럼 사용할 수 있다.

뷰는 SELECT 명령을 기록하는 데이터베이스 객체이다.

SELECT * FROM (SELECT * FROM sample) sq;

위의 예에서 서브쿼리 부분을 뷰 객체로 만들면 다음과 같은 SELECT 명령이 된다.

SELECT * FROM sample_view;

sample_view는 뷰의 이름이다. 뷰를 정의할 때는 이름과 SELECT 명령을 지정한다. 뷰를 만든 후에는 SELECT 명령에서 뷰의 이름을 지정하면 참조할 수 있다.

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

더불어 뷰는 가상 테이블이라고 불리기도 한다. SELECT 명령으로 이루어지는 뷰는 테이블처럼 데이터를 쓰거나 지울 수 있는 저장공간을 가지지 않는다. 그러므로 SELECT 명령에서만 사용하는 것이 좋다.

뷰 작성과 삭제

뷰는 데이터베이스의 객체이기 때문에 DDL로 작성하거나 삭제한다.

  1. 뷰의 작성
CREATE VIEW sample_view AS SELECT * FROM sample;
SELECT * FROM sample_view;

CREATE VIEW로 뷰를 작성한 뒤 SELECT 명령의 FROM 구에 지정해 사용할 수 있다. 또한 뷰는 열을 지정할 수 있다.

CREATE VIEW sample_view (no) AS SELECT * FROM sample;

뷰의 열 지정을 생략한 경우, SELECT 명령의 SELECT 구에서 지정하는 열 정보가 수집되어 자동적으로 뷰의 열로 지정된다. 반대로 열을 지정한 경우엔 SELECT 명령의 SELECT 구에 지정한 열보다 우선된다.

  1. 뷰 삭제
DROP VIEW sample_view;

뷰를 삭제하면 더 이상 뷰를 참조하여 사용할 수 없다.

뷰의 약점

뷰는 테이블과 달리 대량의 저장공간을 필요로 하지 않는다. 데이터베이스에 저장되는 것은 SELECT 명령뿐이기 때문이다. 대신 CPU 자원을 사용한다.

SELECT 명령은 데이터베이스의 테이블에서 행을 검색해 클라이언트로 반환하는 명령이다. 검색뿐만 아니라 ORDER BY로 정렬하거나, GROUP BY로 집계할 수도 있다. 이러한 처리에는 계산능력을 필요로 하기 때문에 컴퓨터의 CPU를 사용한다.

뷰를 참조하면 뷰에 등록되어 있는 SELECT 명령이 실행된다. 실행 결과는 일시적으로 보존되며, 뷰를 참조할 때마다 SELECT 명령이 실행된다.

  • Materialized View

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

이를 회피하기 위해 사용할 수 있는 것이 Materialized View이다. 이는 데이터를 일시적으로 저장해 사용하는 것이 아니라 테이블처럼 저장장치에 저장해두고 사용한다.

이는 처음 참조되었을 때 데이터를 저장해두고, 다시 참조할 때 이전에 저장해 두었던 데이터를 그대로 사용한다. 일반적인 뷰처럼 매번 SELECT를 실행할 필요가 없다. 즉 변경 유무를 확인하여 재실행하는 것은 RDBMS가 자동으로 실행된다.

이는 Oracle과 DB2에서만 사용할 수 있는 데이터베이스 객체이다.

  • 함수 테이블

뷰를 구성하는 SELECT 명령은 단독으로도 실행할 수 있어야 한다. 상관 서브쿼리에서 부모 쿼리와 어떤 식으로든 연관된 서브쿼리의 경우에는 뷰의 SELECT 명령으로 사용할 수 없다. 대신 이 같은 뷰의 약점을 함수 테이블을 이용하여 회피할 수 있다.

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

하지만 이게 무슨 소리인지 모르겟다…