programing

구체화된 뷰의 커밋 시 빠른 새로 고침

oldcodes 2023. 9. 16. 09:53
반응형

구체화된 뷰의 커밋 시 빠른 새로 고침

나는 방금 DEPT와 EMP 테이블을 다음과 같이 만들었습니다.

create table DEPT
( dept_no number , dept_name varchar(32) , dept_desc varchar(32),
  CONSTRAINT dept_pk Primary Key (dept_no) );

create table EMP
( emp_no number, dept_no number, CONSTRAINT emp_pk Primary Key (emp_no,dept_no));

insert into dept values (10,'it','desc1');
insert into dept values (20,'hr','desc2');

insert into emp values (1,10);
insert into emp values (2,20);

다음과 같이 행 모양 보기와 모양 보기를 사용하여 테이블에 모양 보기 로그를 만들었습니다.

create materialized view log on emp with rowid;
create materialized view log on dept with rowid;

create materialized view empdept_mv refresh fast on commit as
select a.rowid dept_rowid, b.rowid emp_rowid, a.dept_no,b.emp_no
from dept a, emp b
where a.dept_no=b.dept_no ;

select * from emp;
    EMP_NO    DEPT_NO
  ---------- ----------
     1         10
     2         20
     3         30

select * from dept;
   DEPT_NO DEPT_NAME                        DEPT_DESC
---------- -------------------------------- --------------------------------
    10 it                               desc1
    20 hr                               desc2
    30 it                               desc3

select * from empdept_mv;

DEPT_ROWID         EMP_ROWID             DEPT_NO     EMP_NO
------------------ ------------------ ---------- ----------
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA         10          1
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB         20          2

새로운 레코드를 삽입하고 COMIT를 했는데 아직도 materialized view를 확인하면 materialized view에 새로운 레코드가 표시되지 않습니다.

insert into dept values (30,'it','desc3');
commit;
insert into emp values (3,30);
commit;

select * from empdept_mv;

DEPT_ROWID         EMP_ROWID             DEPT_NO     EMP_NO
------------------ ------------------ ---------- ----------
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA         10          1
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB         20          2

이제 Fast 및 Complete refresh 절차를 실행하면 Fast refresh는 Mview를 업데이트하지 않고, Fast refresh는 Mview를 업데이트합니다(참고:그러나 Mview는 여전히 REFRESH ON COMMIT)

execute DBMS_MVIEW.REFRESH('empdept_mv', 'F', '', TRUE, FALSE, 0,0,0,FALSE, FALSE);
PL/SQL procedure successfully completed.

DEPT_ROWID         EMP_ROWID             DEPT_NO     EMP_NO
------------------ ------------------ ---------- ----------
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA         10          1
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB         20          2


execute DBMS_MVIEW.REFRESH('test_mview2', 'C', '', TRUE, FALSE, 0,0,0,FALSE, FALSE);
PL/SQL procedure successfully completed.

DEPT_ROWID         EMP_ROWID             DEPT_NO     EMP_NO
------------------ ------------------ ---------- ----------
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA         10          1
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB         20          2
AAAli5AABAAAPZ6AAC AAAli7AABAAAQs6AAC         30          3

DBMS_MSVIEW.EXPROF_MSVIEW 출력은 다음과 같습니다. (capability_name --Possible--msgtxt)

  1. PCT --N--
  2. REFRESH_COMPLETE --Y--
  3. REFRESH_FAST --Y--
  4. 다시 쓰기 --N--
  5. PCT_TABLE --N-- Oracle 오류: 관련 참조_NUM 및 관련_자세한 내용은 TEXT
  6. REFRESH_FAST_After_INSERT --Y--
  7. REFRESH_FAST_After_ONETAB_DML --Y--
  8. REFRESH_FAST_After_ANY_DML --Y--
  9. REFRESH_FAST_PCT --N-- 소재의 어느 세부 테이블에서도 PCT를 사용할 수 없습니다.
  10. REWRITE_FULL_TEXT_MATCH --N-- Oracle 오류: 관련 참조_NUM 및 관련_자세한 내용은 TEXT
  11. REWRITE_FULL_TEXT_MATCH --N-- 조회 재작성이 구체화된 보기에서 비활성화되었습니다.
  12. REWRITE_PARTIAL_TEXT_MATCH --N-- 구체화된 보기는 어떤 유형의 쿼리 재작성도 지원할 수 없습니다.
  13. REWRITE_PARTIAL_TEXT_MATCH --N-- 조회 재작성이 구체화된 보기에서 비활성화되었습니다.
  14. REWRITE_GENERAL --N-- 구체화된 보기는 어떤 유형의 쿼리 재작성도 지원할 수 없습니다.
  15. REWRITE_GENERAL --N-- 조회 재작성이 구체화된 보기에서 비활성화되었습니다.
  16. RWRITE_PCT --N-- 일반적인 재작성이 불가능하거나 PCT가 불가능합니다.
  17. PCT_TABLE_REWRITE --N-- Oracle 오류: 관련 참조_NUM 및 관련_자세한 내용은 TEXT

커밋 시 신속한 새로 고침을 수행하려면 어떻게 해야 합니까?
오라클 버전 세부 정보는 다음과 같습니다.
NLSRTL 10.2.0.4.0션
Database 10 64bit Oracle Database 10g 10.2.0.4.0 64bit션
PL/SQL 10.2.0.4.0 프로덕션
: 프로덕션용 TNS: 10.2.0.4.0션

여전히 문제가 지속되는지는 모르겠지만, 제공해주신 아티스를 살펴보니 다음과 같은 것이 눈에 띄었습니다(여기서 해결책일 수 있음).

ON COMMIT 새로 고침

형상화된 뷰는 ON COMIT 방법을 사용하여 자동으로 새로 고침 할 수 있습니다.따라서 구체화된 뷰가 정의된 테이블을 업데이트한 트랜잭션 커밋을 수행할 때마다 이러한 변경 사항은 구체화된 뷰에 자동으로 반영됩니다.이 접근 방식을 사용할 때의 장점은 구체화된 뷰를 새로 고치기 위해 기억할 필요가 없다는 것입니다.유일한 단점은 추가 처리로 인해 커밋을 완료하는 데 필요한 시간이 조금 더 길어진다는 것입니다.그러나 데이터 웨어하우스에서는 동일한 테이블을 업데이트하려는 동시 프로세스가 없을 가능성이 높기 때문에 문제가 되지 않습니다.

  • 굵은 선이 눈에 띕니다.

그러면 다음과 같습니다.

표 7-1 온 디맨드 리프레쉬 방법

Refresh 옵션 매개 변수 설명 COMPLETE C 구체화된 보기의 정의 쿼리를 다시 계산하여 새로 고침.

구체화된 뷰에 변경 사항을 점진적으로 적용하여 FAST F를 새로 고칩니다.로컬 구체화된 뷰의 경우, 최적화기에서 추정한 새로 고침 방법을 가장 효율적으로 선택합니다.여기서 고려하는 새로 고침 방법은 로그 기반 FAST와 FAST_PCT입니다.

FAST_PCT P 세부사항 테이블에서 변경된 파티션의 영향을 받는 구체화된 뷰의 행을 다시 계산하여 새로 고칩니다.

강제 ? 빠른 새로 고침을 시도합니다.불가능한 경우 완전히 새로 고침됩니다.로컬 구체화된 뷰의 경우, 최적화기에서 추정한 새로 고침 방법을 가장 효율적으로 선택합니다.여기서 고려하는 새로 고침 방법은 로그 기반 FAST, FAST_PCT 및 COMPLETE입니다.

  • 굵은 선이 눈에 띕니다.
  • 저는 개인적으로 FORCE 옵션을 선호합니다.

시간이 좀 지난 후에 (DB와 실행 중인 기계의 파라미터에 따라) 다시 이런 현상이 발생하는지 알 수 있을까요?

빠른 새로 고침이 가능한 경우

모든 구체화된 뷰가 빠른 새로 고침이 가능한 것은 아닙니다.따라서 DBMS_MSVIEW 패키지를 사용합니다.구체화된 뷰에 사용할 수 있는 새로 고침 방법을 결정하기 위한 EXPLAINE_MSVIEW.

구체화된 뷰를 빠르게 새로 고침 할 수 있는 방법을 잘 모르는 경우 DBMS_ADVOR를 사용할 수 있습니다.TUNE_MVIEW 프로시저 - 빠른 리프레시 가능한 구체화 뷰를 작성하는 데 필요한 문이 포함된 스크립트를 제공합니다.

건배.

ROWID를 사용하여 구체화된 뷰 로그를 작성하신 것을 확인하였습니다. 두 테이블 모두 기본 키를 가지고 있어 ROWID 없이 시도할 수 있으므로 실제로는 필요하지 않습니다.

emp에 구체화된 뷰 로그를 작성하고, depart에 구체화된 뷰 로그를 작성합니다.

또한 ROWID로 형상화 뷰 로그를 작성하는 경우에는 Rowid로 형상화 뷰를 작성해야 합니다.

commit 시 구체화 뷰 empdet_mv refresh fast with ROWID를 a.rowid dept_rowid, b.rowid emp_rowid, a.dep_no, b.emp_no를 depta에서 선택하고 empb를 a.dep_no=b.dep_no로 선택하여 materialized 뷰 empdet_mv refresh fast를 만듭니다.

이러한 변경을 시도해 보고 구체화된 뷰가 커밋 시 빠르게 새로 고침되는지 확인할 수 있습니다.

언급URL : https://stackoverflow.com/questions/20103190/fast-refresh-on-commit-of-materialized-view

반응형