[DB] 구체화된 뷰는 테이블과 어떻게 다를까?

Posted by ash tensor on February 29, 2024 · 3 mins read 카테고리
카테고리 링크
📁 DB

[DB] 물리 뷰는 테이블과 어떻게 다를까?

문제 설명

테이블은 데이터베이스의 기본적인 저장 단위로, 행과 열로 구성되어 있고, 실제로 데이터를 저장한다. 그리고 뷰는 실제 데이터를 저장하지 않는다. 뷰는 하나 이상의 테이블을 가상의 테이블처럼 보이게 하는 것이다. 뷰는 쿼리를 이용해서 생성되며, 실제 데이터를 저장하지는 않고, 데이터에 대한 참조만을 저장한다.

이는 일반적인 논리적 뷰의 설명이다. 그렇다면 물리적 뷰는 테이블과 어떻게 다를까?

물리적 뷰 / 구체화된 뷰

“물리적 뷰는 테이블과 어떻게 다르지?” 라는 질문을 받았는데, 대답을 하지 못해서 당황했었다. 왜냐하면, 물리 뷰라는 이름에서 다가오는 늬앙스가 뷰라는 실체가 없고 가상의 테이블이라는 늬앙스와는 다르게 느껴졌기 때문이다.

뷰는 실제 데이터를 저장하지 않는데, 물리 뷰라고? 그렇다면 Physical view라는 말인가? 그럼 피지컬한 실체가 있는 건가? 이런 식으로 생각이 흘러갔기 때문이다. 하지만 물리적 뷰, 즉 materialized view는 이런 개념과는 거리가 있다.

물리적 뷰는 뷰와는 다르게 실제 데이터를 저장한다. 뷰는 쿼리를 이용하여 생성되며, 실제 데이터를 저장하지 않는다. 하지만 물리적 뷰는 쿼리를 이용하여 생성되며, 실제 데이터를 저장한다. 일반적인 뷰와는 다르게, 물리적 뷰는 DB상에 그 실체가 있다.

그렇다면 정말로, 테이블이라고 할 수 있을 것이다. 그렇다면 물리적 뷰는 테이블과 어떻게 다를까?

물리적 뷰는 새로운 데이터를 저장하는 것이 아니라, 기존의 데이터를 저장한다.

그러니까 즉, 물리적 뷰는 이미 존재하는 데이터를 이용해서, 일정부분 가공하고, 필터링된 데이터를 저장한다고 볼 수 있다. 새로운 데이터를 저장하는 테이블과는 거리가 있다. 정규화가 잘 된 테이블이 존재한다고 해 보자. 그런 경우에는 사업 또는 비즈니스 사이클에 필요한 데이터를 얻는다고 할 때, 정규화된 여러 테이블을 조인해야만 필요한 데이터를 얻어야 하는 경우가 많다.

하지만 이런 경우에는 데이터를 조회할 때마다 계속 조인이 발생하고, 매번 쿼리할 때마다 계산이 필요해진다. 이런 경우에는 정규화가 잘 된 테이블이지만 오히려 서비스의 성능을 낮출 수 있다.

반정규화?

아마 DB이론을 공부한 사람이라면 이 경우에 바로 반정규화를 떠올릴 것이다. 중복 테이블을 생성하거나, 중복 컬럼 생성, 테이블 병합 등, 여러 방법이 존재하지만 이 경우에 DB의 무결성이 깨지게 되고, 이는 시스템의 안정성을 해칠 수 있다. 반정규화에 대한 대안으로 물리적 뷰를 사용할 수 있다.

물리적 뷰, 구체화된 뷰는 특정 쿼리의 결과를 데이터베이스에 물리적 실체로 저장하고, 뷰에 엑세스 할 때마다 복잡한 쿼리(JOIN, GROUP BY, ORDER BY 등)를 실행하지 않고, 저장된 결과를 단순히 조회함으로써 성능을 향상시킬 수 있다.

예제

아래 쿼리는 sales 테이블에서 sale_date를 기준으로 월별 매출 합계를 계산하여 monthly_sales_summary 매터리얼라이즈드 뷰를 생성한다. 이제 이 매터리얼라이즈드 뷰를 사용하여 월별 매출에 대한 정보를 조회 한 번으로 얻을 수 있다.


-- 매터리얼라이즈드 뷰 생성 쿼리
CREATE MATERIALIZED VIEW monthly_sales_summary AS
SELECT
    EXTRACT(YEAR FROM sale_date) AS sale_year,
    EXTRACT(MONTH FROM sale_date) AS sale_month,
    SUM(amount) AS total_sales
FROM
    sales
GROUP BY
    EXTRACT(YEAR FROM sale_date),
    EXTRACT(MONTH FROM sale_date);

다음은 매터리얼라이즈드 뷰 새로고침 명령이다. 이 명령은 매터리얼라이즈드 뷰의 데이터를 새로 고쳐서 최신 데이터로 업데이트한다.


REFRESH MATERIALIZED VIEW monthly_sales_summary;

DBMS 별 구체화된 뷰 지원

구체화된 뷰는 DBMS에 따라 지원 여부가 다르다. MYSQL은 지원하지 않는다. 오라클은 지원한다. 오라클은 보통 자동으로 새로 고치지만, 수동으로 새로고침을 할 수도 있다. SQL Server는 Indexed View라는 이름으로 지원한다.


Thanks. mind sharing?

← Previous Post Next Post