Materialized views
Create a view log for the master table
This is required for fast refresh
create materialized view log on <table>
/
or...
create materialized view log on <table>
tablespace <tablespace_name>
/
List all materialized view logs
select log_owner
, log_table
from dba_mview_logs
/
Create a simple materialized view
create materialized view emp_mv
refresh [[fast | complete | force]]
start with sysdate
next sysdate + 1/24
with primary key
as select * from emp@dblink
/
where
Fast = update changes only
Complete = wipe and repopulate the mview
Force = fast if possible, complete if not.
Show all materialized views and their refresh times
set lines 100 pages 999
col last_refresh format a20
select owner
, mview_name
, to_char(last_refresh_date, 'dd/mm/yy hh24:mi') last_refresh
from dba_mviews
order by owner
, last_refresh
/
Show materialized view tables and masters
set lines 100
col mview format a40
col master format a40
select owner || '.' || name mview
, master_owner || '.' || master master
from dba_mview_refresh_times
/
Show refresh jobs in dba_jobs
This is useful for spotting failures
set lines 100
col job format 9999
col log_user format a15
col last format a15
col next format a15
col fail format 9999
col what format a20
select job
, log_user
, to_char(last_date, 'dd/mm/yy hh24:mi') last
, to_char(next_date, 'dd/mm/yy hh24:mi') next
, failures fail
, replace(what, '"') what
from dba_jobs
where what like '%dbms_refresh.refresh%'
/
Force a refresh
All views
set serveroutput on
declare
l_retval number := 0;
begin
dbms_output.enable(null);
dbms_mview.refresh_all_mviews (l_retval,'C','', true, false);
dbms_output.put_line ('returned: '||l_retval);
end;
/
Fast - uses the changes in the view log on the source side.
execute dbms_mview.refresh ('<owner.mv_table>','F');
Complete - truncates or deletes the data (depending on other options) and rebuilds the view from scratch (remember to gather view stats afterwards).
execute dbms_mview.refresh ('<owner.mv_table>','C');
Force - tries a fast. If this does not work, a complete will be done.
execute dbms_mview.refresh ('<owner.mv_table>','?');
Rebuild a broken View
Sometimes the materialised views stop working. If the original table was modified for example (maybe index was changed or a column removed), the view will fail.
- On PROD
drop materialized view log on loyalty.account
create materialized view log on loyalty.account tablespace loyalty_dl_01 nocache with primary key, sequence including new values;
create synonym snap_ltyprd.account for loyalty.account;
- On QA
sqlplus snap_ltyprd/****
drop materialized view account;
create materialized view snap_ltyprd.account tablespace snap_ts using index tablespace snap_ts refresh fast on demand enable query rewrite as select * from account@link_loyalty_ltyprd;
select count('e') from account;
Remember to refresh the view stats!
exec dbms_stats.gather_table_stats(snap_ltyprd, 'account');