programing

Oracle - FAST Refresh 및 JOINs를 사용하여 구체화된 뷰를 작성하는 방법

megabox 2023. 3. 5. 09:40
반응형

Oracle - FAST Refresh 및 JOINs를 사용하여 구체화된 뷰를 작성하는 방법

Oracle이 이 기능을 지원한다고 확신하기 때문에 제가 무엇을 잘못하고 있는지 전혀 알 수 없습니다.이 코드는 동작합니다.

CREATE MATERIALIZED VIEW MV_Test
  NOLOGGING
  CACHE
  BUILD IMMEDIATE 
  REFRESH FAST ON COMMIT 
  AS
    SELECT V.* FROM TPM_PROJECTVERSION V;

JOIN을 추가하면 다음과 같이 파손됩니다.

CREATE MATERIALIZED VIEW MV_Test
  NOLOGGING
  CACHE
  BUILD IMMEDIATE 
  REFRESH FAST ON COMMIT 
  AS
    SELECT V.*, P.* FROM TPM_PROJECTVERSION V
    INNER JOIN TPM_PROJECT P ON P.PROJECTID = V.PROJECTID

에러가 표시되게 되었습니다.

ORA-12054: 구체화된 뷰에 대해 ON COMMIT 새로 고침 속성을 설정할 수 없습니다.

TPM_PROJECT와 TPM_PROJECTVERSION 양쪽에 구체화 뷰 로그를 작성했습니다.TPM_PROJECT의 프라이머리 키는 PROJECTID, TPM_PROJECTVERSION의 복합 프라이머리 키는 (PROJECTID,VERSIONID)입니다.요령이 뭐죠?오라클 매뉴얼을 뒤져봤지만 소용이 없었어요.감사합니다!

먼저 Oracle Database Data Warehousing Guide에서 다음을 참조하십시오.

조인만 있는 구체화된 뷰의 고속 새로 고침 제약 사항

...

  • FROM 목록에 있는 모든 테이블의 rowid가 쿼리의 SELECT 목록에 표시되어야 합니다.

즉, 다음과 같은 문장이 필요합니다.

CREATE MATERIALIZED VIEW MV_Test
  NOLOGGING
  CACHE
  BUILD IMMEDIATE 
  REFRESH FAST ON COMMIT 
  AS
    SELECT V.*, P.*, V.ROWID as V_ROWID, P.ROWID as P_ROWID 
    FROM TPM_PROJECTVERSION V,
         TPM_PROJECT P 
    WHERE P.PROJECTID = V.PROJECTID

또 하나의 중요한 측면은 구체화된 뷰 로그를 다음과 같이 생성해야 한다는 것입니다.with rowid.

기능 테스트 시나리오는 다음과 같습니다.

CREATE TABLE foo(foo NUMBER, CONSTRAINT foo_pk PRIMARY KEY(foo));

CREATE MATERIALIZED VIEW LOG ON foo WITH ROWID;

CREATE TABLE bar(foo NUMBER, bar NUMBER, CONSTRAINT bar_pk PRIMARY KEY(foo, bar));

CREATE MATERIALIZED VIEW LOG ON bar WITH ROWID;

CREATE MATERIALIZED VIEW foo_bar
  NOLOGGING
  CACHE
  BUILD IMMEDIATE
  REFRESH FAST ON COMMIT  AS SELECT foo.foo, 
                                    bar.bar, 
                                    foo.ROWID AS foo_rowid, 
                                    bar.ROWID AS bar_rowid 
                               FROM foo, bar
                              WHERE foo.foo = bar.foo;

ANSI 가입 없이 시도해보셨나요?

CREATE MATERIALIZED VIEW MV_Test
  NOLOGGING
  CACHE
  BUILD IMMEDIATE 
  REFRESH FAST ON COMMIT 
  AS
SELECT V.*, P.* FROM TPM_PROJECTVERSION V,TPM_PROJECT P 
WHERE  P.PROJECTID = V.PROJECTID

쿼리가 참조하고 있는 마스터 테이블에 대해 구체화된 뷰 로그를 생성하지 않으면 REFRESH_FAST에서 오류가 발생합니다.구체화된 뷰에 익숙하지 않은 사용자나 처음 사용하는 경우 Oracle SQLDeveloper를 사용하여 옵션을 그래프로 표시하는 것이 좋습니다.또, 에러에 의해서도, 한층 더 알기 쉬워집니다.

FAST REFRESH 키체크는 다음과 같습니다.

1) An Oracle materialized view log must be present for each base table.
2) The RowIDs of all the base tables must appear in the SELECT list of the MVIEW query definition.
3) If there are outer joins, unique constraints must be placed on the join columns of the inner table.

3번은 놓치기 쉽고 강조할 가치가 있다

이 코드 사용

구체화된 뷰 MV_ptbl_Category2를 작성한다.선택한 대로 즉시 리프레시 포스 온 * ptbl_Category2에서.

참고 - MV_ptbl_Category2는 구체화된 뷰 이름입니다.

Ptbl은 테이블 이름입니다.

언급URL : https://stackoverflow.com/questions/7505020/oracle-how-to-create-a-materialized-view-with-fast-refresh-and-joins

반응형