PostgreSQL Materialized Views

김영준·2022년 6월 16일
1

sql

목록 보기
1/1

이 튜토리얼에서는 쿼리 결과를 물리적으로 저장하고 주기적으로 데이터를 업데이트할 수 있는 PostgreSQL 구체화된 뷰를 소개합니다.

PostgreSQL 보기 자습서 에서 보기는 기본 테이블의 데이터를 나타내는 가상 테이블이라는 것을 배웠습니다. 단순 보기도 업데이트할 수 있습니다.

PostgreSQL은 보기가 데이터를 물리적으로 저장할 수 있도록 보기 개념을 다음 단계로 확장합니다. 그리고 이러한 뷰를 구체화된 뷰라고 합니다.

구체화된 뷰는 복잡하고 비용이 많이 드는 쿼리의 결과를 캐시하고 이 결과를 주기적으로 새로 고칠 수 있습니다.

구체화된 뷰는 빠른 데이터 액세스가 필요한 많은 경우에 유용하므로 데이터 웨어하우스 및 비즈니스 인텔리전스 애플리케이션에서 자주 사용됩니다.

구체화된 뷰 생성

구체화된 뷰를 생성하려면 CREATE MATERIALIZED VIEW 다음과 같이 문을 사용합니다.

CREATE MATERIALIZED VIEW view_name
AS
query
WITH [NO] DATA;

작동 원리

  • 먼저, view_name뒤에 CREATE MATERIALIZED VIEW절 을 지정하십시오.
  • AS둘째, 키워드 뒤에 기본 테이블에서 데이터를 가져오는 쿼리를 추가합니다 .
  • 셋째, 생성 시 구체화된 뷰에 데이터를 로드하려면 WITH DATA옵션을 사용합니다. 그렇지 않으면 를 사용 WITH NO DATA합니다. 를 사용하는 경우 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;

PostgreSQL 구체화된 뷰 예제

다음 명령문은 이라는 구체화된 뷰를 생성합니다 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 구체화된 보기로 작업하는 방법을 배웠습니다.

profile
Fitpet WMS & OMS Backend Developer

0개의 댓글