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;