저자 : 아사이 아츠시
출판 : 한빛미디어
발매 : 2015.11.01
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 명령
ex)
CREATE VIEW sample_view_67 AS SELECT * FROM sample54;
SELECT * FROM sample_view_67;
- 뷰는 필요에 따라 열을 지정할 수도 있는데, 이 경우엔 이름 뒤에 괄호로 묶어 열을 나열.
CREATE VIEW 뷰명 (열명1, 열명2, ... ) AS SELECT 명령
ex)
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 뷰명
ex)
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 조건을 붙여 결괏값을 바꿀 수 있음. 그에 따라 상관 서브쿼리처럼 동작할 수 있음.
'Study > DB' 카테고리의 다른 글
[SQL 첫걸음] 7장.복수의 테이블 다루기 - 32.테이블 결합 (0) | 2018.09.27 |
---|---|
[SQL 첫걸음] 7장.복수의 테이블 다루기 - 31.집합 연산 (0) | 2018.09.27 |
[SQL 첫걸음] 6장.데이터베이스 객체 작성과 삭제 - 29.인덱스 작성과 삭제 (0) | 2018.09.16 |
[SQL 첫걸음] 6장.데이터베이스 객체 작성과 삭제 - 28.인덱스 구조 (0) | 2018.09.16 |
[SQL 첫걸음] 6장.데이터베이스 객체 작성과 삭제 - 27.제약 (0) | 2018.09.16 |