이 튜토리얼에서는 쿼리 결과를 물리적으로 저장하고 주기적으로 데이터를 업데이트할 수 있는 PostgreSQL 구체화된 뷰를 소개합니다.
PostgreSQL 보기 자습서 에서 보기는 기본 테이블의 데이터를 나타내는 가상 테이블이라는 것을 배웠습니다. 단순 보기도 업데이트할 수 있습니다.
PostgreSQL은 보기가 데이터를 물리적으로 저장할 수 있도록 보기 개념을 다음 단계로 확장합니다. 그리고 이러한 뷰를 구체화된 뷰라고 합니다.
구체화된 뷰는 복잡하고 비용이 많이 드는 쿼리의 결과를 캐시하고 이 결과를 주기적으로 새로 고칠 수 있습니다.
구체화된 뷰는 빠른 데이터 액세스가 필요한 많은 경우에 유용하므로 데이터 웨어하우스 및 비즈니스 인텔리전스 애플리케이션에서 자주 사용됩니다.
구체화된 뷰를 생성하려면 CREATE MATERIALIZED VIEW 다음과 같이 문을 사용합니다.
CREATE MATERIALIZED VIEW view_name
AS
query
WITH [NO] DATA;
작동 원리
구체화된 뷰에 데이터를 로드하려면 REFRESH MATERIALIZED VIEW아래와 같이 문 을 사용합니다.
REFRESH MATERIALIZED VIEW view_name;
구체화된 뷰에 대한 데이터를 새로 고칠 때 PostgreSQL은 전체 테이블을 잠그므로 해당 테이블에 대해 데이터를 쿼리할 수 없습니다. 이를 방지하기 위해 CONCURRENTLY옵션을 사용할 수 있습니다.
REFRESH MATERIALIZED VIEW CONCURRENTLY view_name;
옵션을 사용하면 CONCURRENTLYPostgreSQL은 구체화된 뷰의 임시 업데이트 버전을 생성하고 두 버전을 비교 하고 차이점만 INSERT 및 UPDATE 를 수행합니다.
구체화된 뷰가 업데이트되는 동안 쿼리할 수 있습니다. 옵션 을 사용하기 위한 한 가지 요구 사항 은 구체화된 뷰에 인덱스 CONCURRENTLY가 있어야 한다는 것 입니다.UNIQUE
이 CONCURRENTLY옵션은 PostgreSQL 9.4에서만 사용할 수 있습니다.
구체화된 뷰를 제거하는 것은 테이블이나 뷰에 대해 수행한 것처럼 매우 간단합니다. 이것은 다음 문을 사용하여 수행됩니다.
DROP MATERIALIZED VIEW view_name;
다음 명령문은 이라는 구체화된 뷰를 생성합니다 rental_by_category.
CREATE MATERIALIZED VIEW rental_by_category
AS
SELECT c.name AS category,
sum(p.amount) AS total_sales
FROM (((((payment p
JOIN rental r ON ((p.rental_id = r.rental_id)))
JOIN inventory i ON ((r.inventory_id = i.inventory_id)))
JOIN film f ON ((i.film_id = f.film_id)))
JOIN film_category fc ON ((f.film_id = fc.film_id)))
JOIN category c ON ((fc.category_id = c.category_id)))
GROUP BY c.name
ORDER BY sum(p.amount) DESC
WITH NO DATA;
이 옵션 때문에 WITH NO DATA보기에서 데이터를 쿼리할 수 없습니다. 그렇게 하려고 하면 다음과 같은 오류 메시지가 표시됩니다.
SELECT
*
FROM
rental_by_category;
[Err] ERROR: materialized view "rental_by_category" has not been populated
HINT: Use the REFRESH MATERIALIZED VIEW command.
PostgreSQL은 뷰에 데이터를 로드하도록 요청하는 힌트를 제공하는 데 도움이 됩니다. 다음 명령문을 실행하여 수행해 보겠습니다.
REFRESH MATERIALIZED VIEW rental_by_category;
이제 데이터를 다시 쿼리하면 예상대로 결과를 얻을 수 있습니다.
postgresql 구체화된 뷰 예제
이제부터 명령문 rental_by_category을 사용하여 보기 의 데이터를 새로 고칠 수 있습니다 .REFRESH MATERIALIZED VIEW
단, CONCURRENTLY옵션 으로 새로고침을 하기 위해서는 UNIQUE먼저 뷰에 대한 인덱스를 생성해야 합니다.
CREATE UNIQUE INDEX rental_category ON rental_by_category (category);
보기 에 대해 동시에 데이터를 새로 고칩니다 rental_by_category.
REFRESH MATERIALIZED VIEW CONCURRENTLY rental_by_category;
이 자습서에서는 빠른 데이터 검색이 필요한 분석 애플리케이션에 유용한 PostgreSQL 구체화된 보기로 작업하는 방법을 배웠습니다.