SQL 첫걸음 - 6장 뷰 작성과 삭제(6/6)
1. 뷰
뷰는 SELECT 명령을 기록하는 데이터 베이스 객체. 본래 데이터베이스 객체로 등록할 수 없는 SELECT명령을, 객체로서 이름을 붙여 관리할 수 있도록 한 것이 뷰. 뷰를 참조하면 그에 정의된 SELECT명령의 실행결과를 테이블처럼 사용할 수 있음. 뷰를 정의할 때는 이름과 SELECT명령을 지정. 뷰를 만든 후에는 SELECT명령에서 뷰의 이름을 지정하면 참조 가능.
사용 ex)
SELECT *
FROM (SELECT *
FROM sample64) sq;
-> from 구에 서브쿼리 사용 서브쿼리 부분을 '뷰 객체'로 만들면
SELECT *
FROM sample_view_67; -> sample_view_67은 뷰의 이름.
이렇게 서브쿼리 부분을 뷰로 대체하여 SELECT명령을 간략하게 표현. 자주 사용하거나 복잡한 SELECT명령을 뷰로 만들어 편리하게 사용.
가상테이블
뷰는 테이블처럼 취급할 수 있지만, ‘실체가 존재하지 않는다’라는 의미로 ‘가상 테이블’이라 불리기도 함. SELECT명령으로 이뤄지는 뷰는 테이블처럼 데이터를 쓰거나 지울 수 있는 저장공간이 없음. 이때문에 테이블처럼 취급할 수 있다고는 해도 SELECT명령에서만 사용하는것을 권장.
2. 뷰 작성과 삭제
뷰는 데이터베이스 객체이기 때문에 DDL로 작성하거나 삭제. 작성할 때는 CREATE VIEW, 삭제할 때는 DROP VIEW를 사용.
뷰의 작성
CREATE VIEW 뷰명 AS SELECT 명령
CREATE VIEW sample_view_67
AS SELECT * FROM sample54;
SELECT *
FROM sample_view_67;
뷰는 필요에 따라 열을 지정할 수도 있는데, 이 경우엔 이름 뒤에 괄호로 묶어 열을 나열.
CREATE VIEW 뷰명 (열명1, 열명2, … ) AS SELECT 명령
CREATE VIEW sample_view_672
(n, v, v2) AS SELECT no, a, a*2
FROM sample54;
SELECT *
FROM sample_view_672
WHERE n = 1;
뷰의 열 지정을 생략한 경우엔 SELECT명령의 SELECT구에 지정하는 열 정보가 수집되어 자동적으로 뷰의 열로 지정.반대로 열을 지정한 경우에는 SELECT명령의 SELECT구에 지정한 열보다 우선됨. 열 이외에는 정의할 수 없으며, 테이블의 열을 정의할 때처럼 자료형이나 제약도 지정할 수 없음.
뷰의 삭제
DROP VIEW 뷰명
DROP VIEW sample_view_67;
3. 뷰의 약점
1) CPU사용으로 인한 처리속도 저하.
뷰는 데이터베이스 객체로서 저장장치에 저장되나, 데이터베이스에 저장되는것은 SELECT명령뿐이기 때문에 테이블과 달리 대량의 저장공간을 필요로 하지는 않음. 다만 저장공간을 소비하지 않는 대신 CPU자원을 사용. (SELECT명령은 검색뿐만 아니라 ORDER BY로 정렬하거나 GROUP BY로 집계할 수 있음. 이러한 처리는 계산능력을 필요로 하기 떄문에 컴퓨터의 CPU를 사용) 뷰를 참조하면 뷰에 등록된 SELECT 명령이 실행됨. 실행 결과는 일시적으로 보존되며, 뷰를 참조할 때마다 매번 SELECT 명령이 실행됨. 뷰의 근원이 되는 테이블의 데이터양이 많은 경우, 집계처리를 할 때도 뷰가 사용된다면 처리속도가 많이 떨어짐. 뷰를 중첩해서 사용하는 경우에도 처리 속도가 떨어짐.
머티리얼라이즈드 뷰(Materialized View)
-
위와 같은 상황을 회피하기 위해 사용할 수 있는것이 머티리얼라이즈드 뷰.
-
일반적으로 뷰는 데이터를 일시적으로 저장했다가 쿼리 실행 종료시 함께 삭제되는데, 머티리얼라이즈드 뷰는 데이터를 일시적으로 저장해 사용하는 것이 아니라 테이블처럼 저장장치에 저장해두고 사용.
-
머티리얼라이즈드 뷰는 처음 참조되었을 때 데이터를 저장하고 이후 다시 참조 시 이전에 저장해둔 데이터를 그대로 사용.
( 다만 뷰에 지정된 테이블의 데이터가 변경된 경우엔 SELECT명령을 재실행하여 데이터를 다시 저장. 변경 유무를 확인해 재실행하는 것은 RDBMS가 자동으로 실행. )
뷰에 지정된 테이블의 데이터가 자주 변경되지않는다면 머티리얼라이즈드 뷰를 사용해 뷰의 약점을 보완 가능. 그러나 MySQL에서는 머티리얼라이즈드 뷰를 사용 불가. 현재는 Oracle과 DB2에서만 사용할 수 있는 데이터베이스 객체.
2) 부모쿼리와 어떤 식으로든 연관된 서브쿼리(상관 서브쿼리)의 경우, 뷰의 SELECT명령으로 사용 불가.
뷰를 구성하는 SELECT명령은 단독 실행 가능해야하는데, 위 경우에는 단독 실행 불가함하므로 뷰의 SELECT명령으로 사용 불가. 이 같은 뷰의 약점은 함수 테이블을 사용하여 회피 할 수 있음. 함수테이블은 테이블을 결과 값으로 반환해주는 사용자 정의 함수. 함수에는 인수를 지정할 수 있기 때문에 인수의 값에 따라 WHERE 조건을 붙여 결괏값을 바꿀 수 있음. 그에 따라 상관 서브쿼리처럼 동작할 수 있음.
출처 : https://smilejh.tistory.com/