갱신 가능 구체화 뷰는 언제 사용해야 하나요?
갱신 가능 구체화 뷰는 비정규화와 같은 작업을 수행하는 배치 프로세스를 실행할 수 있습니다. 또한 갱신 가능 구체화 뷰 간에 종속성을 설정할 수 있으므로, 한 뷰가 다른 뷰의 결과에 의존하고 해당 뷰가 완료된 후에만 실행되도록 구성할 수 있습니다. 이를 통해 예약된 워크플로나 dbt job과 같은 단순한 DAG를 대체할 수 있습니다. 갱신 가능 구체화 뷰 간 종속성을 설정하는 방법에 대한 자세한 내용은 CREATE VIEW의 Dependencies 섹션을 참조하십시오.
갱신 가능 구체화 뷰를 어떻게 갱신합니까?
SYSTEM REFRESH VIEW 절을 사용할 수 있습니다:
갱신 가능 구체화 뷰가 마지막으로 갱신된 시점은 언제입니까?
system.view_refreshes 시스템 테이블(system table)을 쿼리하면 됩니다:
갱신 주기는 어떻게 변경하나요?
ALTER TABLE...MODIFY REFRESH 구문을 사용하십시오.
새 행을 추가할 때 APPEND 사용하기
APPEND 기능을 사용하면 전체 뷰를 교체하지 않고 테이블 끝에 새 행을 추가할 수 있습니다.
이 기능의 한 가지 활용 방식은 특정 시점의 값 스냅샷을 저장하는 것입니다. 예를 들어, Kafka, Redpanda, 또는 다른 스트리밍 데이터 플랫폼의 메시지 스트림으로 채워지는 events 테이블이 있다고 가정해 보겠습니다.
uuid 컬럼에는 4096개의 값이 있습니다. 총 개수가 가장 많은 값을 찾으려면 다음 쿼리를 작성할 수 있습니다:
uuid의 개수를 집계하여 events_snapshot이라는 새 테이블(table)에 저장한다고 가정하겠습니다. events_snapshot의 스키마(schema)는 다음과 같습니다:
events_snapshot를 쿼리하여 특정 uuid의 시간 경과에 따른 개수를 확인할 수 있습니다:
예시
Stack Overflow
votes, users, badges, posts, postlinks.
해당 가이드에서는 다음 쿼리를 사용해 postlinks 데이터셋을 posts 테이블에 비정규화하는 방법을 설명했습니다:
posts_with_links 테이블에 한 번만 삽입하는 방법을 살펴보았지만, 프로덕션 시스템에서는 이 작업을 주기적으로 실행하는 것이 좋습니다.
posts 테이블과 postlinks 테이블은 모두 업데이트될 수 있습니다. 따라서 이 join을 증분형 materialized view로 구현하려 하기보다는, 이 쿼리가 일정한 인터벌(예: 1시간에 한 번)로 실행되도록 예약하고 그 결과를 post_with_links 테이블에 저장하는 방식으로도 충분할 수 있습니다.
이때 갱신 가능 구체화 뷰가 유용하며, 다음 쿼리로 생성할 수 있습니다:
여기의 구문은
REFRESH 절이 포함된다는 점만 빼면 증분형 materialized view와 동일합니다:IMDb
actors, directors, genres, movie_directors, movies, roles 테이블로 IMDb 데이터셋을 구성했습니다.
그런 다음 영화 출연 횟수가 많은 순으로 정렬해 각 배우의 요약 정보를 계산하는 다음 쿼리를 작성할 수 있습니다.