기본 테이블이 변경될 때 구체화된 보기 업데이트
저는 다음과 같이 구체화된 견해를 가지고 있습니다.
CREATE MATERIALIZED VIEW M_FOO
REFRESH COMPLETE ON COMMIT
AS
SELECT FOO_ID, BAR
FROM FOO
WHERE BAR IS NOT NULL
GROUP BY FOO_ID, BAR
/
COMMENT ON MATERIALIZED VIEW M_FOO IS 'Foo-Bar pairs';
저는 일종의 캐시라고 썼습니다. 소스 테이블은 크지만 서로 다른 쌍의 수는 상당히 적습니다.다른 테이블과 연결하려면 그 쌍이 필요합니다.아직까지는 좋습니다. 질의 속도가 매우 빠릅니다.
그러나 보기에 오래된 데이터가 포함되어 있지 않은지 확인하고 싶습니다.기본 표는 한 달에 네다섯 번 수정되지만 언제인지는 꼭 모르겠습니다.소스 테이블이 변경되면 업데이트되도록 구체화된 뷰를 정의할 수 있는 것으로 알고 있습니다.하지만, 그 문서들은 꽤 복잡해집니다.
정확한 구문은 무엇입니까?
구체화된 보기 로그를 만들어야 합니까?
빠른 새로 고침과 완전 새로 고침의 차이점은 무엇입니까?
질문을 역순으로 받기
FAST 새로 고침은 증분 새로 고침이라고도 합니다.그것은 당신에게 그 차이에 대한 단서를 줄 것입니다.전체 새로 고침은 전체 MView를 처음부터 다시 작성하는 반면, 빠른 새로 고침은 피더 테이블에 대해 실행된 DML의 변경 사항만 적용합니다.
FAST 새로 고침을 실행하려면 적절한 MVIEW LOG가 필요합니다.이렇게 하면 기본 테이블의 데이터에 대한 변경 내용이 추적되므로 Oracle은 전체 테이블을 쿼리하지 않고 델타를 구체화된 보기에 효율적으로 적용할 수 있습니다.
구문과 관련하여 기본 사항은 다음과 같습니다.
SQL> create materialized view log on emp
2 with rowid, primary key, sequence (deptno, job)
3 including new values
4 /
Materialized view log created.
SQL> create materialized view emp_mv
2 refresh fast on commit
3 as
4 select deptno, job from emp
5 group by deptno, job
6 /
Materialized view created.
SQL>
그ON COMMIT
새로 합니다("MVIEW"와 반대).ON DEMAND
정기적으로 대량으로 새로 고치는 것입니다.REFRESH
절은 증분 새로 고침 또는 전체 새로 고침을 적용할지 여부를 지정합니다.사용을 강제하는 몇 가지 쿼리 범주가 있습니다.COMPLETE
새로 고침은 Oracle의 새 버전이 나올 때마다 감소하는 것 같습니다.
작동하는지 확인하기 위한 간단한 테스트...
SQL> select * from emp_mv
2 order by deptno, job
3 /
DEPTNO JOB
---------- ---------
10 MANAGER
10 PRESIDENT
10 SALES
20 ANALYST
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN
40 CLERK
40 DOGSBODY
11 rows selected.
SQL>
신기록은 어떻습니까?
SQL> insert into emp (empno, ename, deptno, job)
2 values (6666, 'GADGET', 40, 'INSPECTOR')
3 /
1 row created.
SQL> commit
2 /
Commit complete.
SQL> select * from emp_mv
2 order by deptno, job
3 /
DEPTNO JOB
---------- ---------
10 MANAGER
10 PRESIDENT
10 SALES
20 ANALYST
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN
40 CLERK
40 DOGSBODY
40 INSPECTOR
12 rows selected.
SQL>
구문에 대한 자세한 내용은 SQL 참조에서 확인할 수 있습니다.또한 데이터 웨어하우징 가이드의 구체화된 보기 장을 읽어볼 가치가 있습니다.
아래의 논평자들의 우려에도 불구하고, 이것은 광고된 대로 작동합니다.안타깝게도 데모를 게시하는 일반적인 장소(SQL Fiddle, db<>fiddle)에서는 구체화된 보기를 허용하지 않습니다.Oracle SQL Live에 대해 다음과 같은 내용을 게시했습니다(무료 Oracle 계정 필요).저는 오라클의 승인을 기다리고 있으며 이 질문이 도착하면 업데이트하겠습니다.
빠른 새로 고침은 구체화된 보기에 변경된 데이터만 삽입/업데이트/삭제합니다.새로 고침을 완료하면 구체화된 보기가 비워지고 모든 행에 복사됩니다.
커밋은 마스터 테이블에서 변경사항이 커밋될 때마다 구체화된 보기가 새로 고쳐진다는 것을 의미합니다.따라서 현재 구문은 매우 비효율적입니다.누군가 foo에서 행을 변경할 때마다 m_foo가 잘리고 foo 테이블의 모든 행이 삽입됩니다.
foo의 수정된 행만 m_foo로 전송되는 빠른 새로 고침을 사용하면 더 효율적으로 수행할 수 있습니다.따라서 많은 오버헤드 없이 일관성을 유지할 수 있습니다.
기본 키를 사용하여 구체화된 보기 로그온 foo를 생성합니다. -- 기본 키가 있다고 가정하면 \; 커밋 시 m_foo 새로 고침 fast를 구체화된 보기를 생성해야 합니다.
db 링크를 사용하거나 foo를 소유하는 스키마가 m_foo를 소유하는 스키마가 아닌 경우 grants 및 동의어와 함께 몇 가지 추가적인 세부 사항이 있습니다.
언급URL : https://stackoverflow.com/questions/2027807/update-materialized-view-when-urderlying-tables-change
'programing' 카테고리의 다른 글
웹 파일 구조에서 공급업체는 무엇을 의미합니까? (0) | 2023.07.26 |
---|---|
위치를 수정하고 있습니다.페이지 스크롤 없이 해시 (0) | 2023.07.26 |
결과 집합 - 커서 : rs.next() 시간이 많이 걸립니다. (0) | 2023.07.26 |
MySQL보다 Oracle을 선택해야 하는 경우 (0) | 2023.07.26 |
MariaDB 인덱스 비교 (0) | 2023.07.26 |