物化視圖的刷新方式說明

物化視圖能夠選擇三種不一樣的刷新方式,根據不一樣的需求,選擇不一樣的刷新方式。
  • Complete刷新:會刪除表中的全部記錄(若是是單表刷新,可能會採用Truncate的方式),而後根據物化視圖中查詢語句的定義從新生成物化視圖。
  • Fast刷新:採用增量刷新的機制,只將自上次刷新之後對基表進行的全部操做刷新到物化視圖中。
  • Force刷新:Oracle自動判斷是否知足Fast刷新條件,若是知足則進行Fast刷新,不然進行Complete刷新。
不是全部的物化視圖均可以進行Fast刷新,只有知足某些條件的物化視圖才具備Fast刷新的能力。根據查詢的不一樣,Fast刷新的限制條件也有所不一樣,下面是關於Fast刷新針對不一樣類型的物化視圖的限制條件的總結。
  • 1.全部類型的快速刷新物化視圖都必須知足的條件:
    • 物化視圖不能包含對不肯定表達式的引用,如SYSDATE和ROWNUM;
    • 物化視圖不能包含對LONG和LONG RAW數據類型的引用。
  • 2.針對只包含多表關聯的物化視圖的限制條件:
    • 必須知足全部快速刷新物化視圖都知足的條件;
    • 不能包括GROUP BY語句或彙集操做;
    • 若是在WHERE語句中包含外鏈接,那麼惟一約束必須存在於鏈接中內表的鏈接列上;
    • 若是不包含外鏈接,那麼WHERE語句沒有限制,若是包含外鏈接,那麼WHERE語句中只能使用AND鏈接,而且只能使用「=」操做。
    • FROM語句列表中全部表的ROWID必須出如今SELECT語句的列表中。
    • FROM語句列表中的全部表必須創建基於ROWID類型的物化視圖日誌。
例如:
1 創建一個能夠成功快速刷新的例子,這個物化視圖只包含鏈接: SQL> create materialized view log on dim_a with rowid; 物化視圖日誌已建立。 SQL> create materialized view log on dim_b with rowid; 物化視圖日誌已建立。 SQL> create materialized view log on fact with rowid; 物化視圖日誌已建立。 SQL> create materialized view mv_fact refresh fast on commit as 2 select f.rowid f_rowid, a.rowid a_rowid, b.rowid b_rowid, f.id, 3 a.name a_name, b.name b_name, num 4 from fact f, dim_a a, dim_b b 5 where f.aid = a.id 6 and f.bid = b.id; 物化視圖已建立。
  • 3.針對彙集的物化視圖的限制條件:
    • 必須知足全部快速刷新物化視圖都知足的條件;
    • 物化視圖查詢的全部表必須創建物化視圖日誌,且物化視圖日誌必須知足下列限制:
    • 包含物化視圖查詢語句中的全部列,包括SELECT列表中的列和WHERE語句中的列;
    • 必須指明ROWID和INCLUDING NEW VALUES;
    • 若是對基本的操做同時包括INSERT、UPDATE和DELETE操做(即不是隻包含INSERT操做),那麼物化視圖日誌應該包括SEQUENCE。
    • 容許的彙集函數包括:SUM、COUNT、AVG、STDDEV、VARIANCE、MIN和MAX;
    • 必須指定COUNT(*);
    • 若是指明瞭除COUNT以外的彙集函數,則COUNT(expression)也必須存在;好比:包含SUM(a),則必須同時包含COUNT(a)。
    • 若是指明瞭VARIANCE(expression)或STDDEV(expression),除了COUNT(expression)外,SUM(expression)也必須指明;Oracle推薦同時包括SUM(expression*expression)。
    • SELECT列表中必須包括全部的GROUP BY列;
    • 當物化視圖屬於下面的某種狀況,則快速刷新只支持常規DML插入和直接裝載,這種類型的物化視圖又稱爲INSERT-ONLY物化視圖;
      • 物化視圖包含MIN或MAX彙集函數;
      • 物化視圖包含SUM(expression),可是沒有包括COUNT(expression);
      • 物化視圖沒有包含COUNT(*)。
      • 注意:若是創建了這種物化視圖且刷新機制是ON COMMIT的,則會存在潛在的問題。當出現了UPDATE或DELETE語句,除非手工徹底刷新解決這個問題,不然物化視圖至此之後都再也不自動刷新,且不會報任何錯誤。
    • 若是包含inline views、outer joins、self joins或grouping set,則兼容性的設置必須在9.0以上;
    • 若是物化視圖創建在視圖或子查詢上,則要求視圖必須能夠徹底合併的。
    • 若是沒有外鏈接,則對WHERE語句沒有限制。若是包含外鏈接,則要求WHERE語句只能包括AND鏈接和「=」操做。對於包含外鏈接的彙集物化視圖,快速刷新支持outer表的修改。且inter表的鏈接列上必須存在惟一約束。
    • 對於包含了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)。
例如:
1 創建能夠成功快速刷新的例子,這個物化視圖只包含彙集: SQL> create materialized view log on fact with rowid, sequence (aid, num) 2 including new values; 物化視圖日誌已建立。 SQL> create materialized view mv_fact refresh fast on commit as 2 select aid, count(*) count, count(num) count_num, sum(num) sum_num 3 from fact group by aid; 物化視圖已建立。 2 創建快速刷新的例子,物化視圖包含彙集和鏈接: SQL> create materialized view log on fact with rowid, sequence (aid, num) 2 including new values; 物化視圖日誌已建立。 SQL> create materialized view log on dim_a with rowid, sequence (id, name) 2 including new values; 物化視圖日誌已建立。 SQL> create materialized view mv_fact refresh fast on commit as 2 select name, count(*) count, count(num) count_num, sum(num) sum_num 3 from fact, dim_a where aid = dim_a.id group by name; 物化視圖已建立。
  • 4.針對包含UNION ALL的物化視圖的限制條件
    • UNION ALL操做必須在查詢的頂層。能夠有一種狀況例外:UNION ALL在第二層,而第一層的查詢語句爲SELECT * FROM;
    • 被UNION ALL操做鏈接在一塊兒的每一個查詢塊都應該知足快速刷新的限制條件;
    • SELECT列表中必須包含一列維護列,叫作UNION ALL標識符,每一個UNION ALL分支的標識符列應包含不一樣的常量值;
    • 不支持外鏈接、遠端數據庫表和包括只容許插入的彙集物化視圖定義查詢;
    • 不支持基於分區改變跟蹤(PCT)的刷新;
    • 數據庫的兼容性設置應設置爲9.2.0。
例如:
1.創建一個符合快速刷新條件的UNION ALL物化視圖 SQL> create materialized view log on dim_a with rowid; 物化視圖日誌已建立。 SQL> create materialized view log on dim_b with rowid; 物化視圖日誌已建立。 SQL> create materialized view log on fact with rowid; 物化視圖日誌已建立。 SQL> create materialized view mv_fact refresh fast on commit as 2 select f.rowid f_rowid, a.rowid row_id, a.name name, num, 'a' marker 3 from fact f, dim_a a 4 where f.aid = a.id 5 union all 6 select f.rowid f_rowid, b.rowid row_id, b.name name, num, 'b' marker 7 from fact f, dim_b b 8 where f.bid = b.id; 物化視圖已建立。
  • 5.針對嵌套物化視圖的限制條件
    • 嵌套物化視圖的每層都必須知足快速刷新的限制條件;
    • 對於同時包含彙集和鏈接的嵌套物化視圖,不支持ON COMMIT的快速刷新。
例如:
SQL> create materialized view log on dim_a with rowid; 物化視圖日誌已建立。 SQL> create materialized view log on dim_b with rowid; 物化視圖日誌已建立。 SQL> create materialized view log on fact with rowid; 物化視圖日誌已建立。 SQL> create materialized view mv_fact refresh fast on commit as 2 select f.rowid f_rowid, a.rowid a_rowid, b.rowid b_rowid, f.id, 3 a.name a_name, b.name b_name, num 4 from fact f, dim_a a, dim_b b 5 where f.aid = a.id 6 and f.bid = b.id; 物化視圖已建立。 SQL> create materialized view log on mv_fact with rowid, sequence (a_name, num) 2 including new values; 物化視圖日誌已建立。 SQL> create materialized view mv_mv_fact refresh fast on commit as 2 select a_name, count(*) count, count(num) count_num, sum(num) sum_num 3 from mv_fact 4 group by a_name; 物化視圖已建立。
相關文章
相關標籤/搜索