토토된 보기포스트그레SQL뷰와 같은 규칙 시스템을 사용하지만 결과는 테이블과 같은 형식으로 유지됩니다. 다음의 주요 차이점은 다음과 같습니다.
MATERIALIZED VIEW mymatview AS SELECT * FROM mytab 생성;
그리고:
CREATE TABLE mymatview AS SELECT * FROM mytab;
구체화된 뷰는 이후에 직접 업데이트될 수 없으며 구체화된 뷰를 생성하는 데 사용된 쿼리는 뷰의 쿼리가 저장되는 것과 정확히 동일한 방식으로 저장되므로 다음을 사용하여 구체화된 뷰에 대한 새로운 데이터가 생성될 수 있습니다.
구현된 보기 새로고침 mymatview;
구체화된 뷰에 대한 정보는포스트그레SQL시스템 카탈로그는 테이블이나 뷰의 경우와 정확히 동일합니다. 따라서 파서의 경우 토토된 뷰는 테이블이나 뷰와 마찬가지로 관계입니다. 토토된 뷰가 쿼리에서 참조되면 데이터는 테이블과 같이 토토된 뷰에서 직접 반환됩니다. 규칙은 토토된 뷰를 채우는 데에만 사용됩니다.
구체화된 뷰에 저장된 데이터에 대한 액세스는 직접 또는 뷰를 통해 기본 테이블에 액세스하는 것보다 훨씬 빠른 경우가 많지만 데이터가 항상 최신인 것은 아닙니다. 그러나 때로는 현재 데이터가 필요하지 않은 경우도 있습니다. 매출을 기록하는 테이블을 생각해 보세요.
테이블 송장 생성(
voice_no 정수 기본 키,
Seller_no 정수, -- 영업사원의 ID
송장_날짜 날짜, -- 판매 날짜
voice_amt 숫자(13,2) -- 판매 금액
);
사람들이 과거 판매 데이터를 빠르게 그래프로 표시하기를 원할 경우 요약을 원할 수 있으며 현재 날짜의 불완전한 데이터에는 관심이 없을 수 있습니다.
CREATE MATERIALIZED VIEW sales_summary AS
선택
판매자_아니요,
송장_날짜,
sum(invoice_amt)::numeric(13,2) as sales_amt
송장에서
WHERE 인보이스_날짜 < CURRENT_DATE
그룹 기준
판매자_아니요,
송장_날짜;
고유 인덱스 생성 sales_summary_seller
ON sales_summary (판매자_번호, 송장_날짜);
이 구체화된 뷰는 영업사원을 위해 생성된 대시보드에 그래프를 표시하는 데 유용할 수 있습니다. 다음 SQL 문을 사용하여 매일 밤 통계를 업데이트하도록 작업을 예약할 수 있습니다.
실현된 보기 새로고침 sales_summary;
토토된 뷰의 또 다른 용도는 외부 데이터 래퍼를 통해 원격 시스템에서 가져온 데이터에 더 빠르게 액세스할 수 있도록 하는 것입니다. 를 사용한 간단한 예file_fdw은 타이밍과 함께 아래에 있지만 이는 로컬 시스템에서 캐시를 사용하기 때문에 원격 시스템에 대한 액세스와 비교한 성능 차이는 일반적으로 여기에 표시된 것보다 큽니다. 또한 토토된 뷰에 인덱스를 추가하는 기능도 활용하고 있습니다. 반면에file_fdw색인을 지원하지 않습니다. 이 이점은 다른 종류의 외부 데이터 액세스에는 적용되지 않을 수 있습니다.
설정:
확장 파일 생성_fdw; 서버 생성 local_file 외부 데이터 래퍼 file_fdw; CREATE FOREIGN TABLE 단어(단어 텍스트 NOT NULL) 서버 local_file OPTIONS(파일 이름 '/usr/share/dict/words'); MATERIALIZED VIEW wrd AS SELECT * FROM 단어 생성; 고유 인덱스 생성 wrd_word ON wrd(단어); 확장 프로그램 생성 pg_trgm; gist를 사용하여 wrd_trgm ON wrd 인덱스 생성(단어 gist_trgm_ops); 진공 분석 wrd;
이제 단어의 철자를 검사해 봅시다. 사용file_fdw직접:
SELECT count(*) FROM 단어 WHERE 단어 = 'caterpiler';
카운트
-------
0
(1행)
함께분석 설명, 다음과 같이 표시됩니다.
집계(비용=21763.99..21764.00 행=1 너비=0) (실제 시간=188.180..188.181 행=1 루프=1)
- 단어에 대한 외부 스캔(비용=0.00..21761.41 행=1032 너비=0)(실제 시간=188.177..188.177 행=0 루프=1)
필터: (단어 = 'caterpiler'::text)
필터에 의해 제거된 행: 479829
외부 파일: /usr/share/dict/words
외부 파일 크기: 4953699
계획 시간: 0.118ms
실행 시간: 188.273ms
대신 토토된 뷰를 사용하면 쿼리가 훨씬 빨라집니다.
집계(비용=4.44..4.45행=1 너비=0) (실제 시간=0.042..0.042행=1 루프=1)
- wrd에서 wrd_word를 사용하여 인덱스 전용 스캔(비용=0.42..4.44행=1 너비=0)(실제 시간=0.039..0.039행=0 루프=1)
색인 조건: (단어 = 'caterpiler'::text)
힙 페치: 0
계획 시간: 0.164ms
실행 시간: 0.117ms
어쨌든 단어 철자가 틀렸으니 우리가 원했던 것이 무엇인지 찾아봅시다. 다시 사용하여file_fdw그리고pg_trgm:
단어에서 단어 선택 ORDER BY 단어 <- 'caterpiler' LIMIT 10;
단어
---------------
음식을 제공하다
애벌레
애벌레
애벌레
애벌레의
캐터필러의
출장요리사
케이터링
음식을 제공하다
음식을 제공한
(10행)
한도(비용=11583.61..11583.64 행=10 너비=32) (실제 시간=1431.591..1431.594 행=10 루프=1)
- 정렬(비용=11583.61..11804.76행=88459너비=32)(실제 시간=1431.589..1431.591행=10루프=1)
정렬 키: ((단어 <- 'caterpiler'::text))
정렬 방법: 상위 N 힙 정렬 메모리: 25kB
- 단어에 대한 외부 스캔(비용=0.00..9672.05 행=88459 너비=32) (실제 시간=0.057..1286.455 행=479829 루프=1)
외부 파일: /usr/share/dict/words
외부 파일 크기: 4953699
계획 시간: 0.128ms
실행 시간: 1431.679ms
토토된 뷰 사용:
한도(비용=0.29..1.06 행=10 너비=10) (실제 시간=187.222..188.257 행=10 루프=1)
- wrd에서 wrd_trgm을 사용하는 인덱스 스캔(비용=0.29..37020.87행=479829너비=10)(실제 시간=187.219..188.252행=10루프=1)
정렬 기준: (단어 <- 'caterpiler'::text)
계획 시간: 0.196ms
실행 시간: 198.640ms
원격 데이터를 로컬 데이터베이스에 정기적으로 업데이트할 수 있다면 성능상의 이점이 상당할 수 있습니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.