2011-08-09 2 views
11

우리 응용 프로그램 중 하나에서 우리는 하루에 세 번 새로 고치고 새로 고치는 데 7 시간이 걸리는 막대한 구체화 된보기가 있습니다. (이상하지 않다, 나는 안다). 이것은 당황 스럽습니다. 사용자와 세션이 새로 고침되는 동안이 구체화 된보기에 액세스 할 수 없지만 분명히 할 수 있다고 생각했기 때문입니다. 새로 고침 유형은 새로 고침Oracle - 완전 새로 고침 중에 구체화 된보기에 계속 액세스 할 수 있습니다. 이게 어떻게 작동합니까?

완전히 새로 고치는 동안 내 이해를 위해 기존 데이터 집합이 삭제되고 쿼리가 다시 실행됩니다. 이것이 사실이면 구체화 된보기가 새로 고쳐지는 동안 사용자/다른 세션이 어떻게 구체화 된보기에 액세스 할 수 있습니까??

+0

나는 이것을 read-consistent-view라고 믿는다. 즉, 행이 수정 될 때마다 누군가가 해당 테이블을 쿼리하는 경우 원래 트랜잭션이 끝날 때까지 그대로 유지됩니다. – Randy

답변

15

원자 리프레시 또는 비 원자 리프레시의 완전 새로 고침이 발생할 수있는 두 가지 다른 방법이 있습니다. 원자 새로 고침은 단순히 구체화 된 뷰의 모든 행을 삭제하기 위해 DELETE를 실행 한 다음 INSERT를 수행하여 새 데이터를 삽입합니다. Oracle의 표준 다중 버전 읽기 일관성 아키텍처를 사용하면 새로 고침이 완료 될 때까지 오라클이 다른 세션에 이전 데이터를 표시 할 수 있습니다. 비 원자 새로 고침에서 Oracle은 Materialized View에서 TRUNCATE를 수행 한 다음 직접 경로 INSERT를 수행하여 새 데이터를 삽입합니다. 이것은 훨씬 효율적이지만 TRUNCATE가 DDL이므로 새로 고치는 동안 이전 데이터가 다른 세션에 표시되지 않음을 의미합니다.

+0

위대한 답변, 감사합니다! – contactmatt