뷰(View)
뷰는 데이터베이스 객체 중 하나로, 본래 데이터베이스 객체로 등록할 수 없는 SELECT 명령을, 객체로써 이름을 붙여 관리할 수 있도록 한 것 입니다.
SELECT 명령은 실행했을 때 테이블에 저장된 데이터를 결과값으로 반환합니다. 따라서 뷰를 참조하면 그에 정의된 SELECT 명령의 실행결과를 테이블처럼 사용할 수 있습니다.
SELECT 명령은 데이터베이스 객체인가? 데이터베이스 객체란 테이블이나 인덱스와 같이 데이터베이스 안에 정의하는 모든 것입니다. SELECT 명령은 데이터베이스 안에 저장되지 않기 때문에 데이터베이스 객체가 아닙니다. SELECT 명령의 경우 이름을 지정할 수도 없고 데이터베이스에 등록되지도 않기 때문입니다.
FROM 구의 경우 SELECT 명령을 통해 서브쿼리의 결과를 지정할 수 있었습니다.
SELECT * FROM (SELECT * FROM sample);
SELECT * FROM sample 이라는 서브쿼리를 “뷰 객체"로 만들어 사용하면 다음과 같은 형태로 사용할 수 있습니다.
SELECT * FROM sample_view;
sample_view는 뷰의 이름으로 뷰를 정의할때는 이름과 SELECT 명령을 지정합니다.
뷰를 만든 후에는 SELECT 명령에서 뷰의 이름을 지정하면 참조할 수 있습니다.
앞선 예제에서는 서브쿼리 부분이 단순한 SELECT 명령으로 되어 있지만 실제 업무에서는 WHERE 구로 조건을 지정하거나 GROUP BY 구로 집계하는 등 좀 더 복잡한 명령으로 이루어집니다.
이런 경우 서브쿼리 부분을 뷰로 대체하면 SELECT 명령을 간략하게 표현할 수 있습니다.
또한, 뷰를 사용함으로써 복잡한 SELECT 명령을 데이터베이스 등록해 두었다가 나중에 간단히 실행할 수 도 있습니다.
즉, 자주 사용하거나 복잡한 SELECT 명령을 뷰로 만들어 편리하게 사용할 수 있는 것입니다.
가상 테이블
뷰는 테이블처럼 취급할 수 있지만 “실체가 존재하지 않는 다”는 의미로 가상 테이블이라 불리기도 합니다.
SELECT 명령으로 이루어지는 뷰는 테이블 처럼 데이터를 쓰거나 지울 수 있는 저장공간을 가지지 않습니다.
이 때문에 테이블처럼 취급할 수 있다고 해도 “SELECT 명령에서만 사용"하는 것을 권장합니다.
INSERT나 UPDATE, DELETE 명령에서도 조건이 맞으면 가능하지만 사용에 주의할 필요가 있습니다.
뷰 작성
뷰는 데이터베이스 객체이기 때문에 DDL로 작성하거나 삭제합니다.
작성할 때는 CREATE VIEW 명령을 사용합니다.
CREATE VIEW 뷰명 AS SELECT 명령
CREATE VIEW 다음에 뷰의 이름을 지정하고 AS로 SELECT 명령을 지정합니다.
CREATE VIEW의 AS 키워드는 별명을 붙일 때 사용하는 AS와는 달리 생략할 수 없습니다.
다음은 뷰 작성 예시입니다.
CREATE VIEW sample_view AS SELECT * FROM sample;
뷰는 필요에 따라 열을 지정할 수 도 있는데 이 경우에는 이름 뒤에 괄호로 묶어 열을 나열합니다.
CREATE VIEW 뷰명(열명1, 열명2, ...) AS SELECT 명령
뷰의 열 지정을 생략한 경우에는 SELECT 구에서 지정하는 열 정보가 수집되어 자동적으로 뷰의 열로 지정됩니다.
만약 열을 지정했을 경우 SELECT 명령의 SELECT 구에 지정한 열보다 우선됩니다.
다만, SELECT 명령의 SELECT 구와 같은 수의 열을 일일이 지정해야 하므로 SELECT 명령의 모든 열을 사용할 경우에는 열을 지정하지 않는 편이 낫습니다.
또한 열 이외에는 정의할 수 없으며, 테이블의 열을 정의할 때 처럼 자료형이나 제약도 지정할 수 없습니다.
다음은 열을 지정해서 VIEW를 작성하는 예시입니다.
CREATE VIEW sample_view_2(id, description) AS SELECT * FROM sample;
뷰 삭제
뷰를 삭제할 경우에는 DROP VIEW를 사용합니다. 일단 뷰를 삭제하면 더 이상 뷰를 참조하여 사용할 수 없습니다.
DROP VIEW 뷰명
다음은 뷰 삭제 예시입니다.
DROP VIEW sample_view_2;
뷰의 약점
뷰는 데이터베이스 객체로써 저장장치에 저장됩니다.
하지만 테이블과 달리 대량의 저장공간을 필요로 하지 않습니다. 데이터베이스에 저장되는 것은 SELECT 명령뿐이기 때문입니다.
다만, 저장공간을 소비하지 않는 대신 CPU 자원을 사용합니다.
SELECT 명령의 경우 데이터베이스 테이블에서 행을 검색해 클라이언트로 반환하는 명령입니다.
검색뿐 아니라 ORDER BY로 정렬하거나 GROUP BY로 집계할 수 도 있는데 이러한 처리는 계산능력을 필요로 하기 때문에 CPU 자원을 사용해야 합니다.
뷰를 참조하면 뷰에 등록되어 있는 SELECT 명령이 실행됩니다.
실행 결과는 일시적으로 보존되며 뷰를 참조할 때마다 SELECT 명령이 실행됩니다.
머티리얼라이즈드 뷰(Materialized View)
뷰의 근원이 되는 테이블에 보관하는 데이터의 양이 많은 경우, 집계처리할 때도 뷰가 사용된다면 처리속도가 떨어질 수 밖에 없습니다.
또한 뷰를 중첩해서 사용하는 경우에도 처리속도가 떨어지기 쉽습니다.
이런 상황을 회피하기 위해서 사용할 수 있는 것이 머티리얼라이즈드 뷰입니다.
일반적으로 뷰는 데이터를 일시적으로 저장했다가 쿼리가 실행 종료될 때 함께 삭제됩니다.
그에 비해 머티리얼라이즈드 뷰는 데이터를 일시적으로 저장해 사용하는 것이 아니라 테이블처럼 저장장치에 저장해두고 사용합니다.
일반적으로 뷰는 데이터를 일시적으로 저장했다가 쿼리가 실행 종료될 때 함께 삭제됩니다.
하지만 머티리얼라이즈드 뷰는 처음 참조되었을 때 데이터를 저장해둡니다.
이 후 다시 참조할때 이전에 저장해 두었던 데이터를 그대로 사용합니다.
덕분에 일반적인 뷰처럼 매번 SELECT 명령을 실행할 필요가 없습니다.
다만, 뷰에 지정된 테이블의 데이터가 변경된 경우에는 SELECT 명령을 재실행하여 데이터를 다시 저장합니다.
이처럼 변경 유무를 확인하여 재실행하는 것은 RDBMS가 자동으로 실행합니다.
뷰에 지정된 테이블의 데이터가 자주 변경되지 않는다면 머티리얼라이즈드 뷰를 사용하여 뷰의 약점을 보완할 수 있습니다.
단, MySQL에서는 머티리얼라이즈드 뷰를 사용할 수 없습니다. 지금은 DB2와 Oracle에서만 사용할 수 있는 데이터베이스 객체입니다.
함수테이블
뷰를 구성하는 SELECT 명령의 경우 단독으로 실행할 수 있어야 합니다.
상관 서브쿼리와 같이 부모 쿼리와 자식 쿼리가 연관된 서브쿼리 같은 경우는 뷰의 SELECT 명령으로 사용할 수 없습니다.
대신 함수 테이블을 사용하여 약점을 회피할 수 있습니다.
함수 테이블은 테이블을 결과값으로 반환해주는 사용자 정의 함수입니다.
함수에는 인수를 지정할 수 있기 때문에 인수의 값에 따라 WHERE 조건을 붙여 결괏값을 바꿀 수 있습니다.
그에 따라 상관 서브쿼리 처럼 동작할 수 있습니다.
정리
- 뷰는 데이터베이스 객체 중 하나로, 본래 데이터베이스 객체로 등록할 수 없는 SELECT 명령을, 객체로써 이름을 붙여 관리할 수 있도록 한 것 입니다.
- 사용할 때마다 SELECT 명령을 사용하는 대신 뷰를 사용하면 자주 사용하거나 복잡한 SELECT 명령을 뷰로 만들어 편리하게 사용할 수 있습니다.
- 뷰는 테이블처럼 취급할 수 있지만 “실체가 존재하지 않는 다”는 의미로 가상 테이블이라 불리기도 합니다.
- CREATE VIEW 뷰명 AS SELECT 명령 와 같은 형식으로 뷰를 생성할 수 있습니다. 그리고 뷰명 뒤에 열을 지정하여 사용할 수도 있습니다. (지정하지 않을 경우 SELECT 결과 값으로 열이 자동으로 들어감)
- DROP VIEW 뷰명 와 같은 형식으로 뷰를 삭제할 수 있습니다.
- 뷰를 참조할때 SELECT 명령을 통해 결과를 전달하는 방식이기 때문에 저장공간을 사용하지 않지만 CPU 자원을 사용합니다.
- 뷰를 사용할때 테이블에 양이 많은 경우에 집계처리를 하거나 뷰를 중첩해서 사용할 경우 처리속도가 떨어질 수 있는데 이때 머티리얼라이즈드 뷰를 사용하여 저장장치에 뷰를 저장해서 사용할 수 있습니다. (단, 변경사항이 있을 경우 똑같이 SELECT 명령을 사용합니다.)
- 뷰로 지정한 SELECT 명령은 단독실행이 가능해야 하며, 상관 서브쿼리 같이 부모 쿼리와 자식 쿼리가 연관되어 있는 서브 쿼리를 사용해야 하는 경우 함수테이블을 사용하여 해결할 수 있습니다.
'CS > DataBase' 카테고리의 다른 글
데이터베이스 첫걸음 정리 - 32장. 테이블 결합 (0) | 2022.10.03 |
---|---|
데이터베이스 첫걸음 정리 - 31장. 집합 연산 (0) | 2022.10.01 |
데이터베이스 첫걸음 정리 - 29장. 인덱스 작성과 삭제 (1) | 2022.09.29 |
데이터베이스 첫걸음 정리 - 28장. 인덱스 구조 (0) | 2022.09.27 |
데이터베이스 첫걸음 정리 - 27장. 제약 (0) | 2022.09.26 |