Postgres에서 구체화 된 뷰 교체


23

Postgres 9.3새로운 열로 업데이트하고 싶다는 구체화 된 견해가 있습니다. 그러나 다른 구체화 된 뷰도이 뷰에 의존하며 오류 메시지는 다른 객체가 뷰에 의존 할 때 뷰를 삭제할 수 없음을 나타냅니다.

오류 : 다른 객체가 의존하기 때문에 materialized view latest_charges를 삭제할 수 없습니다.

또한 문서에서 REPLACE 키워드가 구체화 된보기에 유효하지 않은 것으로 보입니다. 모든 종속 객체를 삭제하고 각 객체를 다시 작성하는 것 외에 다른 바로 가기가 있습니까?


7
슬프게도, 나는 당신이 그것들을 모두 버리고 재건하는 것에 고착되어 있다고 생각합니다.
Craig Ringer

@CraigRinger 님이 답변에 추가하고 싶습니까?
dezso

답변:


17

PostgreSQL 9.4부터 CREATE VIEW 문서와 달리 CREATE MATERIALIZED VIEW 문서 에는 REPLACE 키워드가 언급되어 있지 않습니다. 모든 종속 객체를 삭제하고 각 객체를 다시 작성하는 것 외에는 지름길이없는 것 같습니다.

그렇게하면 두 가지 작은 것만 추천 할 수 있습니다.

  1. DROP MATERIALIZED VIEW blabla CASCADE를 사용하여 모든 종속 객체 목록을 가져옵니다.
  2. 한 번의 트랜잭션으로 모든 종속 개체를 삭제하고 재생산하십시오.

1
고마워, 이것은 내가 한 일과 정확히 같습니다. 다른 많은 관점에서 재사용되는 분석 목적으로 하나의 기본 구체화 된 뷰를 작성하고 있기 때문에 똑바로 유지하는 것은 고통 스럽습니다. 이 기본보기는 거의 변경되지 않지만이 기본보기는 매일 변경됩니다.
John

4

내 상황에서는보기 레이어를 사용하여 방울을 제한하는 것을 선호합니다.

  1. "_new"접미사로 구체화 된 뷰의 사본을 작성하고 성능을 위해 "WITH NO DATA"도 사용하십시오. 접미 부 및 DROP ... CASCADE를 통해 발견 된 기타 종속 오브젝트로 인덱스도 작성하십시오.
  2. 새로운 구체화 된 뷰에 대한 뷰를 생성하여 추상화 계층을 제공하므로 한 곳에서만 변경하면됩니다.
  3. 기존 종속성을 대체하여 대신 새보기를 참조하십시오 (사전 필요한 경우 데이터 새로 고침)
  4. 부양 가족이 없어야하는 구체화 된 시각과 지표를 삭제
  5. 구체화 된보기 및 색인을 변경하여 접미사를 삭제하여 원래 이름을 복원하십시오.

예.

create table test (myfield int);
insert into test values (1);
create materialized view mv_test as select myfield from test;
create view v_test as select myfield from mv_test;
select * from v_test;
create materialized view mv_test_new as select myfield, myfield+1 as myfield2 from test;
alter view v_test rename to v_test_old;
alter materialized view mv_test rename to mv_test_old;
create view v_test as select myfield,myfield2 from mv_test_new;
select * from v_test;
alter materialized view mv_test_new rename to mv_test;
drop view v_test_old; -- when ready
drop materialized view mv_test_old; -- when ready

마지막 두 단계는 확실하지 않습니다. 4는 5로 나오는 문장입니까? 명명 된 matviews 및 뷰를 사용하여 간단한 예를 들어 볼 수 있습니까?
kimbo305

잘린 문장을 수정하고 예제를 추가 함
RuiDC

1

PgAdmin (버전 4.x)에서는 속성 상자에서 정의를 쉽게 수정할 수있었습니다 (where 절을 추가했습니다). 그런 식으로 문제를 해결할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.