DBMS_MVIEW 패키지의 기본 개념과 패키지 내의 프러시저와 함수를 사용하는 방법을 설명합니다.
개요
DBMS_MVIEW는 실체화 뷰와 관련된 정보를 제공하고 이 정보를 최근의 것으로 변경할 수 있는 REFRESH 기능을 사용하기 위한 프러시저를 제공하는 패키지입니다.
프러시저
본 절에서는 DBMS_MVIEW 패키지에서 제공하는 프러시저를 알파벳 순으로 설명합니다.
EXPLAIN_REWRITE
SQL의 질의 다시 쓰기(Query Rewrite) 정보를 설명하는 프러시저입니다. 이 프러시저는 왜 SQL 질의가 재 작성에 실패했는지 또는 어떤 실체화 뷰를 사용해서 재작성 되었는지, 재작성된 SQL 질의는 무엇인지를 설명해줍니다.
이러한 정보를 밑바탕으로 사용자는 SQL 질의가 재작성될 수 있도록 처리할 수 있습니다. query 파라미터로 전달받은 SQL 질의문은 실제로 수행되지 않으며, 결과는 현재 스키마의 REWRITE_TABLE 테이블에 저장됩니다. 단, 이 프러시저를 호출하기 전에 $TB_HOME/scripts/rewrite_table.sql 스크립트를 실행하여 REWRITE_TABLE 테이블을 미리 생성해야 합니다.
EXPLAIN_REWRITE 프러시저의 세부 내용은 다음과 같습니다.
프로토타입
DBMS_MVIEW.EXPLAIN_REWRITE
(
query IN VARCHAR2,
statement_id IN VARCHAR2
);
파라미터
파라미터
설명
query
SQL 질의문
statement_id
SQL 질의문의 결과를 구별하기 위해 사용자가 정한 고유 식별자
이 식별자는 REWRITE_TABLE 테이블의 STATEMENT_ID 컬럼에 저장
예제
REFRESH
실체화 뷰를 Refresh하는 프러시저입니다.
REFRESH 프러시저의 세부 내용은 다음과 같습니다.
프로토타입
파라미터
파라미터
설명
qualified_obj
Refresh할 실체화 뷰
refresh_method
Refresh에 사용될 방법
C 또는 c : 완전 Refresh를 사용한다. 원본 테이블의 모든 데이터를 다시 읽어 materialized view를 재생성함.
F 또는 f : 빠른 Refresh를 사용한다. 원본 테이블의 변경된 부분만 반영하며, materialized view log가 필요함.
? : 빠른 Refresh가 가능한 경우 빠른 Refresh를 사용하고, 그렇지 않으면 완전 Refresh를 사용 (기본값)
create table base as (select mod(level, 100) a, level*10 b from dual
connect by level<=10000);
create materialized view mv enable query rewrite as
select sum(a+b) s, count(b+a) c from base;
@rewrite_table.sql
exec dbms_mview.explain_rewrite('select avg(a+b) from base')
select MV_OWNER, MV_NAME, QUERY, REWRITTEN_TXT, MESSAGE
from rewrite_table;
MV_OWNER MV_NAME QUERY REWRITTEN_TXT MESSAGE
-------- -------- --------------- -------------------- ----------
SYS MV SELECT AVG(A+B) SELECT ("MV"."S" 010: query block was
FROM BASE / "MV"."C") "AVG(A+B)" rewritten with
FROM "SYS"."MV" materialized view
select avg(a+b) SELECT ("MV"."S" 000: whole query was
from base / "MV"."C") "AVG(A+B)" written
FROM "SYS"."MV"
DBMS_MVIEW.REFRESH
(
qualified_obj IN VARCHAR2,
refresh_method IN VARCHAR2
);
create user myuser identified by myuser;
create table myuser.t (
id number primary key,
val number
);
create materialized view log on myuser.t
with rowid, sequence (val)
including new values;
create materialized view myuser.mv_t
build immediate
refresh fast
on demand
as
select sum(val) as total_val
from myuser.t;
call dbms_mview.refresh('myuser.mv_t', 'c');
call dbms_mview.refresh('myuser.mv_t', 'f');
call dbms_mview.refresh('myuser.mv_t', '?');
/* refresh가 complete 방식인지 fast 방식인지 확인 가능 */
select owner, mview_name, last_refresh_type, last_refresh_date, staleness
from dba_mviews
where owner = 'MYUSER' and mview_name = 'MV_T';