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로 작성하거나 삭제한다.
- 뷰의 작성
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
구에 지정한 열보다 우선된다.
- 뷰 삭제
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
조건을 붙여 결괏값을 바꿀 수 있다. 그에 따라 상관 서브쿼리처럼 동작할 수 있다.
하지만 이게 무슨 소리인지 모르겟다…