物化檢視詳解

li__hl8888發表於2016-11-08



 

物化檢視

物化檢視是包括一個查詢結果的資料庫對像,它是遠端資料的的本地副本,或者用來生成基於資料表求和的彙總表。物化檢視儲存基於遠端表的資料,也可以稱為快照。物化檢視可以基於表查詢,檢視和其它的物化檢視。通常情況下,在複製環境下,物化檢視被稱為主表,在資料倉儲中稱為明細表。
對於複製,物化檢視允許你在本地維護遠端資料的副本,這些副本是隻讀的。如果你想修改本地副本,必須用高階複製的功能。當你想從一個表或檢視中抽取資料時,你可以用從物化檢視中抽取。
對於資料倉儲,建立的物化檢視通常情況下是聚合檢視,單一表聚合檢視和連線檢視。

物化檢視日誌
如果你想要採用快速重新整理的話,必須建立基於主表的物化檢視日誌。物化檢視日誌可以記錄主表被更新記錄的主鍵、ROWID或物件標識或者二者全部。物化檢視日誌也可以包含其他列用以支援帶子查詢的物化檢視的快速重新整理。
物化檢視日誌表的名稱為MLOG$_後面跟主體物件的名稱。物化檢視日誌和主體物件建立在相同的使用者模式下。一個物化檢視日誌可以支援多個基於主體物件的物化檢視。
有下列幾種物化檢視日誌:
主鍵:物化檢視日誌在記錄主體物件發生變化的記錄時,是根據主鍵定位的。
ROWID:物化檢視日誌在記錄主體物件發生變化的記錄時,是根據ROWID定位的。
物件標識:物化檢視日誌在記錄主體物件發生變化的記錄時,是根據物件標識定位的。
組合型別:物化檢視日誌在記錄主體物件發生變化的記錄時,是根據上面三種型別的組合來定位的。如果物化檢視日誌根據主鍵、ROWID和物件標識定位變化的資料,則這種物化檢視日誌同時支援主鍵、ROWID和物件物化檢視,這種物化檢視日誌對於一個包含三種型別物化檢視的環境是很有用的。組合型別物化檢視日誌和其他型別物化檢視日誌工作方式相同,只不過多記錄了一、二種型別。
雖然主鍵物化檢視日誌和ROWID物化檢視日誌的差別很小,但是這些差別在實際使用中有著很大的影響。ROWID物化檢視日誌會在進行重組和截斷時十分困難。例如,如果你對主表進行了重組和截斷,那麼ROWID物化檢視必須執行完全重新整理,這是因為ROWID發生了變化。

物化檢視實踐
Oracle提供以下幾種不同型別的物化檢視,以滿足各種複製環境的需要:主鍵物化檢視和ROWID物化檢視。
主鍵物化檢視
主鍵物化檢視是預設的物化檢視。在複製環境下,如果主鍵物化檢視是作為物化檢視組的一部分建立的,如果指定了FOR UPDATE語句,那麼這個物化檢視是可更新的,且這個物化檢視組必須和主站點中複製組的同名。另外,可更新物化檢視必須和主複製組在不同的資料庫中。當修改發生後,修改的資料以行級為單位被傳播,每行資料由主鍵確定。
主鍵物化檢視可以包含一個子查詢,因此你可以在建立物化檢視時,建立所有資料的一個子集,也就是說,建立物化檢視時可以只選取你需要的資料行。如果主站點中的主物件建立了物化檢視日誌表,那麼一些包含特定型別子查詢的主鍵物化檢視仍然可以快速(增量)重新整理。

SQL> create materialized view log on emp;
Materialized view log created.
SQL> create materialized view mv_emp_pk
  2  build deferred
  3  refresh fast
  4  start with sysdate
  5  next sysdate + 1/48
  6  with primary key
  7  as
  8  select * from emp;
Materialized view created.
SQL> select * from mv_emp_pk;
no rows selected

子查詢物化檢視
SQL>create materialized view m_test_view
as
select * from gwm_tabattribute a where exists (select * from gwm_attribute b where a.gwm_ano=b.gwm_ano);
生成資料有兩大選項:
Build immediate:在建立物化檢視的同時根據主表生成資料,預設選項
Bulid deferred:在建立物化檢視的同時,在物化檢視內不生成資料,如果此時沒有生成資料,以後可以採取:EXEC DBMS_MVIEW.Refresh(‘MV_name’,’C’),注意必須使用全量重新整理,預設是增量重新整理,所以這裡引數必須是C,因為之前都沒有生成資料,所以必須全量。
重新整理方式有:complete fast force
Complete:完全重新整理整個物化檢視,相當於重新生成物化檢視,此時即時增量重新整理可用也全量重新整理
Fast:當有資料更新時依照相應的規則對物化檢視進行更新,該選項必須在建立有物化檢視日誌的情況下才能使用。

Force:當增量重新整理可用則增量重新整理,當增量重新整理不可用,則全量重新整理(此項為預設選項)
不過從實際情況出發,應該儘量不使用預設選項,可以考慮使用增量重新整理,對大表特別有效,大表全量更新速度是非常慢的,特別是在存在索引的情況下。在建立物化檢視語句中,以下條件是所有型別的快速重新整理物化檢視都必須滿足的條件:

1.物化檢視不能包含對不重複表示式的引用,如SYSDATE和ROWNUM;

2.物化檢視不能包含對LONG和LONG RAW資料型別的引用。

只包含連線的物化檢視:

1.必須滿足所有快速重新整理物化檢視都滿足的條件;

2.不能包括GROUP BY語句或聚集操作;

3.如果在WHERE語句中包含外連線,那麼唯一約束必須存在於連線中內表的連線列上;

4.如果不包含外連線,那麼WHERE語句沒有限制,如果包含外連線,那麼WHERE語句中只能使用AND連線,並且只能使用“=”操作。

5.FROM語句列表中所有表的ROWID必須出現在SELECT語句的列表中。

6.FROM語句列表中的所有表必須建立基於ROWID型別的物化檢視日誌。

包含聚集的物化檢視:

1.必須滿足所有快速重新整理物化檢視都滿足的條件;

2.物化檢視查詢的所有表必須建立物化檢視日誌,且物化檢視日誌必須滿足下列限制:

(1)包含物化檢視查詢語句中的所有列,包括SELECT列表中的列和WHERE語句中的列;

(2)必須指明ROWID和INCLUDING NEW VALUES;

INCLUDING Specify INCLUDING to save both new and old values in the log. If this log is for a table on which you have a single-table materialized aggregate view, and if you want the materialized view to be eligible for fast refresh, then you must specify INCLUDING.
EXCLUDING Specify EXCLUDING to disable the recording of new values in the log. This is the default. You can use this clause to avoid the overhead of recording new values. Do not use this clause if you have a fast-refreshable single-table materialized aggregate view defined on the master table.

(3)如果對基表的操作同時包括INSERT、UPDATE和DELETE操作(即不是隻包含INSERT操作),那麼物化檢視日誌應該包括WITH SEQUENCE,則物化檢視日子中將會包含
SEQUENCE$$,給每個操作一個SEQUENCE號,從而保證重新整理時按照順序進行重新整理。
Specify SEQUENCE to indicate that a sequence value providing additional ordering information should be recorded in the materialized view log. Sequence numbers are necessary to support fast refresh after some update scenarios.

3.允許的聚集函式包括:SUM、COUNT、AVG、STDDEV、VARIANCE、MIN和MAX;

4.必須指定COUNT(*);

5.如果指明瞭除COUNT之外的聚集函式,則COUNT(expr)也必須存在;

比如:包含SUM(a),則必須同時包含COUNT(a)。

6.如果指明瞭VARIANCE(expr)或STDDEV(expr),除了COUNT(expr)外,SUM(expr)也必須指明;

Oracle推薦同時包括SUM(expr*expr)。

7.SELECT列表中必須包括所有的GROUP BY列;

8.當物化檢視屬於下面的某種情況,則快速重新整理只支援常規DML插入和直接裝載,這種型別的物化檢視又稱為INSERT-ONLY物化檢視;

物化檢視包含MIN或MAX聚集函式;

物化檢視包含SUM(expr),但是沒有包括COUNT(expr);

物化檢視沒有包含COUNT(*)。

注意:如果建立了這種物化檢視且重新整理機制是ON COMMIT的,則會存在潛在的問題。當出現了UPDATE或DELETE語句,除非手工完全重新整理解決這個問題,否則物化檢視至此以後都不再自動重新整理,且不會報任何錯誤。

9.如果包含inline views、outer joins、self joins或grouping set,則相容性的設定必須在9.0以上;

10.如果物化檢視建立在檢視或子查詢上,則要求檢視必須可以完全合併的。

11.如果沒有外連線,則對WHERE語句沒有限制。如果包含外連線,則要求WHERE語句只能包括AND連線和“=”操作。對於包含外連線的聚集物化檢視,快速重新整理支援outer表的修改。且inter表的連線列上必須存在唯一約束。

12.對於包含了ROLLUP、CUBE、GROUPING SET的物化檢視必須滿足下列限制條件:

SELECT語句列表中應該包含GROUPING識別符號:可以是GROUP BY表示式中所有列的GROUPING_ID函式,也可以是GROUP BY表示式中每一列的GROUPING函式;

例如:GROUP BY語句為:GROUP BY CUBE(a, b),則SELECT列表應該包括GROUPING_ID(a, b)或者GROUPING(a)和GROUPING(b)。

GROUP BY不能產生重複的GROUPING。

比如:GROUP BY a, ROLLUP(a, b)則不支援快速重新整理,因為包含了重複的GROUPING:(a), (a, b), (a)。

見下例

SQL>CREATE MATERIALIZED VIEW LOG ON PRODUCTS WITH
SEQUENCE,ROWID
(PROD_ID,PROD_NAME,PROD_DESC,PROD_SUBCATEGORY,
PROD_CATEGORY,PROD_CATEGORY_DESC,PROD_WEIGHT_CLASS,
PROD_UNIT_OF_MEASURE,
PROD_PACK_SIZE,SUPPLIER_ID,PROD_STATUS,PROD_LIST_PRICE,
PROD_MIN_PRICE)
including new values;
SQL>CREATE MATERIALIZEd VIEW LOG ON SALES
WITH SEQUENCE,ROWID
(PROD_ID,CUST_ID,CHANNEL_ID,PROMO_ID,QUANTITY_SOLD,
AMOUNT_SOLD)
including new values;
SQL>CREATE MATERIALIZED VIEW PRODUCT_SALES_MV
PCTFREE 0
TABLESPACE USERS
STORAGE(INITIAL 8k NEXT 8k PCTINCREASE 0)
BUILD IMMEDIATE
REFRESH FAST
enable query rewrite
AS
SELECT P.PROD_NAME,SUM(S.AMOUNT_SOLD) AS DOLLAR_SALES,
COUNT(*) AS CNT, COUNT(S.AMOUNT_SOLD) AS CNT_AMT
FROM SALES S,PRODUCTS P
WHERE S.PROD_ID = P.PROD_ID
group by p.prod_name;
SQL>CREATE MATERIALIZED VIEW SUM_SALES
PARALLEL
BUILD IMMEDIATE
REFRESH FAST ON COMMIT AS
SELECT S.PROD_ID,S.TIME_ID,COUNT(*) AS COUNT_GRP,
SUM(S.AMOUNT_SOLD) AS SUM_DOLLAR_SALES,
COUNT(S.AMOUNT_SOLD) AS COUNT_DOLLAR_SALES,
SUM(S.QUANTITY_SOLD) AS SUM_QUANTITY_SALES,
COUNT(S.QUANTITY_SOLD) AS COUNT_QUANTITY_SALES
FROM SALES S
group by s.prod_id,s.time_id;

包含UNION ALL的物化檢視:

1.UNION ALL操作必須在查詢的頂層。可以有一種情況例外:UNION ALL在第二層,而第一層的查詢語句為SELECT * FROM;

2.被UNION ALL操作連線在一起的每個查詢塊都應該滿足快速重新整理的限制條件;

3.SELECT列表中必須包含一列維護列,叫做UNION ALL識別符號,每個UNION ALL分支的識別符號列應包含不同的常量值;

4.不支援外連線、遠端資料庫表和包括只允許插入的聚集物化檢視定義查詢;

5.不支援基於分割槽改變跟蹤(PCT)的重新整理;

6.相容性設定應設定為9.2.0。

巢狀物化檢視:

巢狀物化檢視的每層都必須滿足快速重新整理的限制條件;

對於同時包含聚集和連線的巢狀物化檢視,不支援ON COMMIT的快速重新整理。

(This note describes 9i Local Aggregate Materialized View Fast Refresh Restrictions. Doc ID: Note:222843.1)

重新整理時間:on demand on commit start with/ next
On demand:在需要重新整理時進行重新整理(人工判斷)
On commit:在基表上有提交操作時,進行更新
Start with:指定首次重新整理的時間(一般指定的是當前時間,不過也可以在建立物化檢視時不生成資料,則可以考慮在指定的時間重新整理,從而生成資料)
Next:重新整理的週期時間

查詢重寫(Query Rewrite):包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE兩種。分別指出建立的物化檢視是否支援查詢重寫。查詢重寫是指當對物化檢視的基表進行查詢時,Oracle會自動判斷能否透過查詢物化檢視 來得到結果,如果可以,則避免了聚集或連線操作,而直接從已經計算好的物化檢視中讀取資料。預設為DISABLE QUERY REWRITE。

SQL> Create materialized view MV_TEST
Refresh fast
Enable query rewrite
As
Select * from TEST;
ROWID物化檢視
為了後向相容性,Oracle除了預設的主鍵物化檢視外,還支援ROWID物化檢視。ROWID物化檢視基於主表物件中行記錄的物理標識ROWID。在複製環境,ROWID物化檢視只被用在基於Oracle7版本的主物件的物化檢視,它不能被用於建立基於Oracle8或更高版本主站點的物化檢視。
SQL>  create materialized view mv_emp_rowid
  2    build immediate
  3    refresh force
  4    on commit
  5    with rowid
  6    as
  7*   select * from emp
Materialized view created.

刪除日誌:
DROP materialized view log on emp;
刪除物化檢視
drop materialized view mv_emp_pk
基本和對錶的操作一致 --物化檢視由於是物理真實存在的,故可以建立索引。

物化檢視的優缺點

優點:
1,物化檢視的最大的優勢是可以提高效能:Oracle的物化檢視提供了強大的功能,可以用於預先計算並儲存表連線或聚集等耗時較多的操作的結果,這樣,在執行查詢時,就可以避免進行這些耗時的操作,而從快速的得到結果。
2, 物化檢視有很多方面和索引很相似
3,透過預先計算好答案儲存起來,可以大大地減少機器的負載
A,更少的物理讀--掃描更少的資料
B,更少的寫--不用經常排序和聚集
C。減少CPU的消耗--不用對資料進行聚集計算和函式呼叫
D,顯著地加快響應時間--在使用物化檢視查詢資料時(與主表相反),將會很快的返回查詢結果
缺點:
1,物化檢視用於只讀或者“精讀”環境下工作最好 ,不用於聯機事務處理系統(OLTP)環境,在事實表等更新時會導致物化檢視行鎖,從而影響系統併發性。
2,物化檢視有出現無法快速重新整理,導致查詢資料不準確的現象
3,Rowid物化檢視(建立的物化檢視通常情況下有主鍵,rowid,和子查詢檢視)只有一個單一的主表,不能包括下面任何一項:
A,Distinct 或者聚合函式.
B,Group by,子查詢,連線和SET操作
4,物化檢視會增加對磁碟資源的需求,即需要永久分配的硬碟空間給物化檢視來儲存資料
5,物化檢視的工作原理受一些可能的約束,比如主鍵,外來鍵等。

 


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

相關文章