뷰(View)는 하나 이상의 결과 집합을 나타내는 가상 테이블이다.
논리적 모델의 일부로서가 아니고, 가상적인 릴레이션으로서 사용자에게 보이는 릴레이션을 의미한다. 뷰는 시스템 카탈로그(system catalog)에 저장된다.
보안 강화
뷰를 사용하여 민감한 데이터를 숨기고, 사용자가 접근할 수 있는 데이터의 범위를 제한할 수 있다.
예시) 직원 테이블에서 급여 정보만 제외하고 나머지 정보를 제공하는 뷰를 생성하여 일반 사용자에게 제공
쿼리 단순화
복잡한 SQL 쿼리를 미리 정의된 뷰로 캡슐화하여, 간단하게 사용할 수 있다.
이를 통해 쿼리 작성의 복잡성을 줄이고, 유지보수를 쉽게 할 수 있다.
예시) 여러 테이블을 조인하여 자주 사용되는 정보를 하나의 뷰로 생성하여, 뷰를 간단히 조회할 수 있다.
데이터 일관성 유지
자주 사용되는 계산이나 변환 로직을 뷰로 정의하면, 데이터의 일관성을 유지할 수 있다. 모든 사용자와 애플리케이션이 동일한 방식으로 데이터를 처리하게 된다.
예시) 환율을 적용하여 가격을 변환하는 로직을 뷰로 생성하면, 모든 사용자가 일관된 가격 정보를 보게 된다.
데이터 무결성
뷰를 통해 튜플을 추가하거나 수정할 때, 튜플이 뷰를 정의하는 SELECT문의 WHERE절의 기준에 맞지 않으면 뷰의 내용에서 사라진다.
하지만, 뷰와 WITH CHECK OPTION을 함께 정의하면 데이터의 무결성을 유지할 수 있다.
데이터 독립성 제공
뷰를 사용하여 물리적 데이터베이스 구조의 변경이 응용 프로그램에 미치는 영향을 최소화할 수 있다.
예시) 기본 테이블의 구조가 변경되더라도 뷰의 정의를 수정함으로써 응용 프로그램에 필요한 데이터는 동일한 형식으로 제공할 수 있다.
동일한 데이터에 대한 여러 가지 뷰 제공
예시) 직원 데이터에 대해 부서별, 직급별, 지역별 등의 여러 가지 뷰를 생성하여 사용자 요구에 맞는 다양한 데이터를 제공할 수 있다.
성능 저하 가능성
뷰가 복잡한 쿼리를 포함하고 있거나, 여러 테이블을 조인하고 있을 경우, 뷰를 사용할 때마다 해당 쿼리가 실행되어 성능 저하를 초래할 수 있다.
예시) 수백만 개의 행이 있는 테이블을 조인하는 뷰를 자주 조회하면, 데이터베이스의 성능이 저하될 수 있다.
제한된 업데이트 기능
모든 뷰가 업데이트 가능한 것은 아니다. 특히, 여러 테이블을 조인하거나 집계 함수를 사용하는 뷰는 업데이트, 삽입, 삭제가 제한될 수 있다.
예시) 집계 함수를 사용한 뷰는 일반적으로 데이터 업데이트가 불가능하다.
CREATE VIEW EMPLOYEE_VIEW AS
SELECT EMPLOYEE_ID, NAME, DEPT
FROM EMPLOYEES;
WHERE DEPT = 'SALES'
WITH CHECK OPTION;
CREATE VIEW MONTHLY_SALES AS
SELECT YEAR(ORDER_DATE) AS YEAR, MONTH(ORDER_DATE) AS Month, SUM(TOTAL_AMOUNT) AS TOTAL_SALES
FROM ORDERS
GROUP BY YEAR(ORDER_DATE), MONTH(ORDER_DATE);
일부 경우를 제외하고는 일반적으로 뷰 릴레이션에 대한 변경은 허용되지 않는다.
갱신이 불가능한 뷰
NOT NULL이 지정되어 있는 경우SUM,AVG,MIN, MAX, COUNT 등)가 포함된 뷰실체화 뷰(Materialized View)는 일반 뷰와 달리 뷰의 결과를 물리적으로 저장하는 뷰이다. 스냅샷(snapshot)이라고도 한다.
즉, 실체화 뷰는 뷰의 결과를 데이터베이스에 테이블 형태로 저장하여 성능을 향상시킨다. 일반 뷰는 참조할 때마다 쿼리가 실행되지만, 실체화 뷰는 저장된 결과를 참조하므로 조회 속도가 빠르다.
성능 향상
자주 참조되는 복잡한 쿼리 결과를 미리 계산하여 저장하므로, 조회 시 성능이 크게 향상된다.
데이터 일관성
데이터가 변경되면 실체화 뷰를 갱신해야 하므로, 갱신 주기를 설정하여 데이터 일관성을 유지할 수 있다.
관리
실체화 뷰는 저장된 데이터를 주기적으로 갱신해야 하므로, 관리가 필요하다.
ex) 트리거나 프로시저를 사용하여 주기적으로 갱신
CREATE MATERIALIZED VIEW SALES_SUMMARY AS
SELECT SALES_EMPLOYEE_ID, SUM(SALES_AMOUNT) AS TOTAL_SALES
FROM SALES
GROUP BY SALES_EMPLOYEE_ID;
참고
데이터베이스론