物化檢視-學習篇

lingsam發表於2013-04-08
語法:
create materialized view 物化檢視名稱 as 檢視定義 
解釋:
預先計算並儲存表連線或匯聚等耗時較多的操作的結果;當查詢時,可以避免執行這些耗時的操作,從而快速達到的查詢結果。比較類似於索引。使用物化檢視的作用就是為了提高查詢效率。
物化檢視佔用一定的儲存空間,且當基表發生變化時,物化檢視也應重新整理。
物化檢視的優點比較:
(1)無物化檢視時:
SQL>select object_type,count(1) from dba_objects group by object_type;
(2)有物化檢視時:
SQL>create materialized view mv_object_count as
select object_type,count(1) from dba_objects group by object_type;
SQL>select * form.
mv_object_count;
可以通過比較兩者執行計劃,檢視兩者的查詢效率。

資料字典中獲取物化檢視資訊:
user_mviews
查詢物化檢視表
SQL>select object_name, object_type, status from user_objects where object_name='MV_OBJECT_COUNT';
OBJECT_NAME         OBJECT_TYPE         STATUS  

---------------     -----------         ------  

 

MV_OBJECT_COUNT     TABLE                VALID  

MV_OBJECT_COUNT     MATERIALIZED VIEW    VALID


在查詢結果中含有兩條記錄,其中一條標識了物化檢視本身,而另一條則標識了物化檢視的附屬資料表。物化檢視建立時,會將查詢定義所獲得的資料載入到附屬資料表中。而當查詢物化檢視時,查詢的物件實際是物化檢視的附屬表。

建立物化檢視時,會先建立表,再將資料匯入。該過程將消耗較大的資源,甚至會影響客戶端的相應速度。此時,可以考慮在建立時使用延遲載入策略。
SQL> drop materialized view mv_object_count;
SQL> create materialized view mv_object_count build deferred as  
 2  select object_type, count(*) object_count  

 3  from tmp_user_objects  

 4  group by object_type;  
SQL>select * from mv_object_count; 反饋結果無資料。
重新整理:
手動重新整理:
SQL>exec dbms_mview.refresh('mv_object_count');  
SQL>select * from mv_object_count;  有結果反饋
基表提交時,自動重新整理:
SQL
> alter materialized view mv_object_count refresh on commit;  
此時更改基表後,如向基表中插入記錄數並提交,則資料自動同步。缺點:
當資料頻繁更新時,將給資料庫效能帶來極大的負載。所以這種策略僅僅適用於那些讀取頻繁,而更新較少的場景下。
查詢重寫:

查詢重寫的物件為普通查詢語句。在查詢語句中,Oracle總是搜尋from子句中所指定的資料來源(表或檢視)。查詢重寫是指,當進行查詢時,Oracle改寫查詢語句,搜尋其他資料來源,以在保證相同結果的情況下提高執行效率。而這個新的資料來源,則往往是物化檢視。

當然,使用查詢重寫,首先要啟用物化檢視的查詢重寫功能。例如,對於檢視mv_object_count,啟用查詢重寫功能的SQL語句如下所示。

SQL> alter materialized view mv_object_count enable query rewrite; 

SQL>select object_name, object_type, status from user_objects where object_name='MV_OBJECT_COUNT';


可以看出,雖然在整個查詢語句中,並未使用物化檢視mv_object_count。但由於查詢重寫功能的存在,Oracle自動將資料查詢的資料來源指向了mv_object_count

SQL> alter materialized view mv_object_count disable query rewrite;

SQL>select object_name, object_type, status from user_objects where object_name='MV_OBJECT_COUNT';

 在執行計劃中可以看出,Oracle使用了from子句指定的查詢物件--tmp_user_objects進行查詢。查詢語句的花費基數為4。

SQL> alter materialized view mv_object_count enable query rewrite; 

select count(*) from user_objects;

Oracle在執行過程中,會發現利用物化檢視mv_object_count可以獲得相同的查詢結果,並且更有效率,因此便使用了查詢重寫。這一切換過程是Oracle自動完成的,使用者無須手動控制。





來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26764468/viewspace-757997/,如需轉載,請註明出處,否則將追究法律責任。

相關文章