物化視圖學習筆記一

add by htliu  -2009/10


基本說明
create table t(key int primary key,val varchar2(50));
插入記錄
select *  from t
1 1 a
2 2 b
3 3 c

----------
create view v as select * from t;

select  * from v;此時普通視圖和表一樣查詢

-------------
select rowid,a.* from t a;
1 AAAMmTAAHAAAAAuAAA 1 a
2 AAAMmTAAHAAAAAuAAB 2 b
3 AAAMmTAAHAAAAAuAAC 3 c
select rowid,a.* from v a;
1 AAAMmTAAHAAAAAuAAA 1 a
2 AAAMmTAAHAAAAAuAAB 2 b
3 AAAMmTAAHAAAAAuAAC 3 c
可以看出視圖查詢數據是完全根據基表來的
----------------------------------------
創建物化視圖:

create materialized view mv as select *  from  t;

select rowid,m.* from mv m;
1 AAAMmWAAHAAAAA8AAA 1 a
2 AAAMmWAAHAAAAA8AAB 2 b
3 AAAMmWAAHAAAAA8AAC 3 c-----可以看出rowid發生變化  也即不是原來記錄

---------------
update t set val='aa' where key=1;
commit
select * from t=select * from v;
1 1 aa
2 2 b
3 3 c
select * from mv;---沒有變化  可以從以上看出物化視圖創建時就是一個基表的簡單拷貝
1 1 a
2 2 b
3 3 c
-----下面研究刷新
刷新類型:完全、增量、(還有force是能全則全否則增量)
模式:手動、自動

---手動刷新
SQL> exec dbms_mview.refresh('mv','c');
 
PL/SQL procedure successfully completed
 
查詢:select rowid,b.* from mv b;  ---數據已經更新
1 AAAMmWAAHAAAAA8AAD 1 aa
2 AAAMmWAAHAAAAA8AAE 2 b
3 AAAMmWAAHAAAAA8AAF 3 c---可以看出rowid也變化了  其實在刷新的時候做了刪除再插入操作

---常用刷新參數
dbms_mview.refresh(’CUST_SALES’, parallelism => 10);---數據大的時候並行度
dbms_mview.refresh_dependent (’SALES’);---基於該表的所有mv都刷新
dbms_mview.refresh_all_mviews;---所有mv都刷新


------------------fast研究-------------------------------------------------------------------------

drop  materialized view mv;

create materialized view log on t;

select *   from user_objects;查看生成MLOG$_T表跟蹤基表變化,並且一個基表只能創建一個mlog$


create materialized view mv refresh fast as select * from t;--創建fast mv

select aa.rowid,aa.* from mv aa

1 AAAMmbAAHAAAABEAAA 1 aa
2 AAAMmbAAHAAAABEAAB 2 b
3 AAAMmbAAHAAAABEAAC 3 c

update t set val='aaa' where key=1;
commit;
select * from MLOG$_T
1 1 4000-1-1 U U 04

exec dbms_mview.refresh('mv','f');
select count(*) from MLOG$_T;---=0 同步後自動清空,

select aa.rowid,aa.* from mv aa

1 AAAMmbAAHAAAABEAAA 1 aa----rowid沒變
2 AAAMmbAAHAAAABEAAB 2 b
3 AAAMmbAAHAAAABEAAC 3 c

-----------------------------------------mv 常用法--------------------------------------------

1、優化---大表過濾後產生少量記錄
2、dblink+mv數據複製同步

--------------------Query Rewrites-研究----------
--創建測試表
create table my_all_objects
as
select * from all_objects
union all
select * from all_objects
union all
select * from all_objects;
select count(*)from my_all_objects---147609
insert/*+append*/ into my_all_objects select *  from all_objects;
commit
select count(*)from my_all_objects---344421

analyze table my_all_objects compute statistics;


select owner,count(*) from my_all_objects group by owner;---查詢原表my_all_objects消耗很多資源
此時cost1678

--啓用re
alter session set query_rewrite_enabled=true;

alter session set query_rewrite_integrity=enforced;

create materialized view  my_all_objects_aggs
build immediate
refresh on commit------------------------------------------自動刷新 當基表變的時候
enable query rewrite
as select owner,count(*) from my_all_objects group by owner;

analyze table my_all_objects_aggs compute statistics;

-------------------------
select owner,count(*) from my_all_objects group by owner;---執行計劃變成查詢my_all_objects_aggs
此時cost變成很少3


insert into  my_all_objects(owner,object_name,object_type,object_id)values('a','b','c','111111');

select owner,count(*) from my_all_objects where owner='a' group by owner;---數據自動更新 ,並且也是查詢my_all_objects_aggs

re會智能判斷,否則查詢基表
– Ignore alphabetic case
– Recognize equivalent joins
– Compare the defining text of a named view


是否使用了re  可以查看執行計劃 前提是cost

* Initialization parameters:
– OPTIMIZER_MODE
– QUERY_REWRITE_ENABLED
– QUERY_REWRITE_INTEGRITY
* Dynamic and session-level param
– QUERY_REWRITE_ENABLED
– QUERY_REWRITE_INTEGRITY
* Hints: REWRITE and NOREWRITE
* Dimensions

SQL> SELECT /*+ NOREWRITE */
2    p.prod_name, SUM (s.quantity_sold),
3    SUM (s.amount_sold)
4  FROM   sales s, products p
5  WHERE s.prod_id = p.prod_id
6  GROUP BY p.prod_name;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章