10. 실체화 뷰 쿼리로 재작성
2011.06.08 03:19
<Materialized View>
-실체화 뷰
-일반적인 view가 논리적 view라면 Mview는 물리적으로 실제 데이터를 갖는다.
snapshot 기법을 이용한 데이터 복제용도로 사용하던 것을 대량의 data를 미리 조인하거나 집계하는 형태로 많이 사용됨
Mview 특징
- refresh 옵션을 이용해 오라클이 집계 테이블을 자동 관리하도록 할 수 있음
- 옵티마이저에 의한 query rewrite가 지원된다(query_rewrite_enabled 제어) SQL문장을 수행하였어도 미리 정의된 MView가 존재한다면, MView를 조회하도록 Query가 다시 쓰여지는 됩니다
<오라클클럽 발췌>
- BUILD IMMEDIATE : MView 생성과 동시에 데이터들도 생성되는 옵션
- BUILD DEFERRED : MView를 생성은 하지만, 그 안의 데이터는 추후에 생성하도록 하는 기능 입니다.
- REFRESH 절은 오라클이 MView의 데이터를 언제, 어떻게 Refresh 하는지를 결정 하는 방법입니다.
ON COMMIT 은 기초 테이블에 Commit 이 일어날 때 Refresh 가 일어나는 방안이며, 이는 1 개의 테이블에 COUNT(*), SUM(*)과 같은 집합 함수를 사용하거나, MView에 조인만이 있는 경우, Group By 절에 사용된 컬럼에 대해 COUNT(col) 함수가 기술된 경우만 사용이 가능 합니다.
ON DEMAND는 사용자가 DBMS_MVIEW 패키지 (REFRESH, REFRESH_ALL_MVIEWS, REFRESH_DEPENDENT) 를 실행 한 경우 Refresh 되는 경우 입니다.
- Refresh를 하는 방법에는 FORCE, COMPLETE, FAST, NEVER의 4가지가 존재 합니다. COMPLETE : MView의 정의에 따라 MView의 데이터 전체가 Refresh 되는 FAST : 새로운 데이터가 삽입될 때마다 점진적으로 Refresh 되는 방안으로 Direct Path나 Mview log를 이용 합니다. FORCE : 이 경우 먼저 Fast Refresh가 가능한지 점검 후 가능하면 이를 적용하고, 아니면 Complete Refresh를 적용 NEVER : MView의 Refresh를 발생시키지 않습니다 |
____________________________________________________________________________________________________________
TEST
환경:상품,고객.판매 테이블 생성
-기존 테이블에 발생한 트랜잭션을 실시간 반영할 수 있도록 MV로그를 생성
create materialized view log on 판매
with sequence, rowid(상품ID, 고객ID, 판매일자, 판매수량, 판매금액)
including new values;
--Mview 생성
create materialized view 월고객상품별_MV
build immediate -- 바로 MV 데이터 생성
refresh fast on commit -- 커밋 시점에 MV에 실시간 반영
enable query rewrite -- query rewrite 활성화
as
select 상품ID, 고객ID, substr(판매일자, 1, 6) 판매월
, sum(판매수량) 판매수량, sum(판매금액) 판매금액
from 판매
group by 상품ID, 고객ID, substr(판매일자, 1, 6);
select p.상품명, c.고객명, substr(s.판매일자, 1, 6) 판매월 ------------------------------------------------------------------------------------------------------ Call Count CPU Time Elapsed Time Disk Query Current Rows Misses in library cache during parse: 1 Rows Row Source Operation |
*판매테이블을 쿼리했지만 옵티마이저에 의해 월고객상품별_MV가 액세스 되었고 그 단계에서 6개 블록만 읽음
-no_rewrite 힌트를 이용해 쿼리 재작성 기능을 방지
select /*+ no_rewrite */ p.상품명, c.고객명, substr(s.판매일자, 1, 6) 판매월 Call Count CPU Time Elapsed Time Disk Query Current Rows Misses in library cache during parse: 1 Rows Row Source Operation |
*판매 테이블을 직접 액세스하면서 419개의 블록 I./O가 발생
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
35 | 6. 조인 제거 | AskZZang | 2011.06.01 | 5441 |
34 | 4. 조건절 Pushing | 오예스 | 2011.05.31 | 17495 |
33 | 5. 조건절 이행 | balto | 2011.05.30 | 5465 |
32 | 2. 서브쿼리 Unnesting | 토시리 | 2011.05.18 | 2080 |
31 | 3. 뷰 Merging | 오라클잭 | 2011.05.17 | 6082 |
30 | 1. 쿼리 변환이란? | 운영자 | 2011.05.16 | 6258 |
29 | 8. 통계정보 Ⅱ | AskZZang | 2011.05.04 | 5913 |
28 | 7. 비용 | balto | 2011.05.02 | 5004 |
27 | 5. 카디널리티 | 오라클잭 | 2011.04.27 | 12922 |
26 | 6. 히스토그램 | 오예스 | 2011.04.25 | 17415 |
25 | 4. 통계정보 Ⅰ | 토시리 | 2011.04.25 | 16017 |
24 | 3. 옵티마이저의 한계 | 휘휘 | 2011.04.19 | 6700 |
23 | 2. 옵티마이저 행동에 영향을 미치는 요소 | balto | 2011.04.18 | 6163 |
22 | 3. 옵티마이저의 한계 - P | 휘휘 | 2011.04.18 | 3699 |
21 | 1. 옵티마이저 | 휘휘 | 2011.04.18 | 6079 |
20 | 8. 고급 조인 테크닉-1 | 휘휘 | 2011.04.05 | 6463 |
19 | 8. 고급 조인 테크닉-2 | 오라클잭 | 2011.04.05 | 12564 |
18 | 7. 조인을 내포한 DML 튜닝 | 오예스 | 2011.04.04 | 9955 |
17 | 4. 조인 순서의 중요성 | AskZZang | 2011.03.30 | 5329 |
16 | 1. 인덱스 구조 | 운영자 | 2011.03.30 | 15954 |