物化檢視(zt)

zhouwf0726發表於2019-06-24
Oracle 的物化檢視

Oracle 的物化檢視提供了強大的功能,可以用在不同的環境中。在不同的環境中,物化檢視的作用也不相同。

資料倉儲中的物化檢視主要用於預先計算並儲存表連線或聚集等耗時較多的操作的結果,這樣,在執行查詢時,就可以避免進行這些耗時的操作,而從快速的得到結果。在資料倉儲中,還經常使用查詢重寫( query rewrite )機制,這樣不需要修改原有的查詢語句, Oracle 會自動選擇合適的物化檢視進行查詢,完全對應用透明。

物化檢視和表一樣可以直接進行查詢。物化檢視可以基於分割槽表,物化檢視本身也可以分割槽。

除了在資料倉儲中使用,物化檢視還用於複製、移動計算等方面。

物化檢視有很多方面和索引很相似:使用物化檢視的目的是為了提高查詢效能;物化檢視對應用透明,增加和刪除物化檢視不會影響應用程式中 SQL 語句的正確性和有效性;物化檢視需要佔用儲存空間;當基表發生變化時,物化檢視也應當重新整理。

物化檢視可以分為以下三種型別:包含聚集的物化檢視;只包含連線的物化檢視;巢狀物化檢視。三種物化檢視的快速重新整理的限制條件有很大區別,而對於其他方面則區別不大。

建立物化檢視時可以指定多種選項,下面對幾種主要的選擇進行簡單說明:

建立方式( Build Methods ):包括 BUILD IMMEDIATE BUILD DEFERRED 兩種。 BUILD IMMEDIATE 是在建立物化檢視的時候就生成資料,而 BUILD DEFERRED 則在建立時不生成資料,以後根據需要在生成資料。預設為 BUILD IMMEDIATE

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

重新整理( Refresh ):指當基表發生了 DML 操作後,物化檢視何時採用哪種方式和基表進行同步。重新整理的模式有兩種: ON DEMAND ON COMMIT ON DEMAND 指物化檢視在使用者需要的時候進行重新整理,可以手工通過 DBMS_MVIEW.REFRESH 等方法來進行重新整理,也可以通過 JOB 定時進行重新整理。 ON COMMIT 指出物化檢視在對基表的 DML 操作提交的同時進行重新整理。重新整理的方法有四種: FAST COMPLETE FORCE NEVER FAST 重新整理採用增量重新整理,只重新整理自上次重新整理以後進行的修改。 COMPLETE 重新整理對整個物化檢視進行完全的重新整理。如果選擇 FORCE 方式,則 Oracle 在重新整理時會去判斷是否可以進行快速重新整理,如果可以則採用 FAST 方式,否則採用 COMPLETE 的方式。 NEVER 指物化檢視不進行任何重新整理。預設值是 FORCE ON DEMAND

在建立物化檢視的時候可以指定 ORDER BY 語句,使生成的資料按照一定的順序進行儲存。不過這個語句不會寫入物化檢視的定義中,而且對以後的重新整理也無效。

物化檢視日誌:如果需要進行快速重新整理,則需要建立物化檢視日誌。物化檢視日誌根據不同物化檢視的快速重新整理的需要,可以建立為 ROWID PRIMARY KEY 型別的。還可以選擇是否包括 SEQUENCE INCLUDING NEW VALUES 以及指定列的列表。

可以指明 ON PREBUILD TABLE 語句將物化檢視建立在一個已經存在的表上。這種情況下,物化檢視和表必須同名。當刪除物化檢視時,不會刪除同名的表。這種物化檢視的查詢重寫要求引數 QUERY_REWRITE_INTEGERITY 必須設定為 trusted 或者 stale_tolerated

物化檢視可以進行分割槽。而且基於分割槽的物化檢視可以支援分割槽變化跟蹤( PCT )。具有這種特性的物化檢視,當基表進行了分割槽維護操作後,仍然可以進行快速重新整理操作。

對於聚集物化檢視,可以在 GROUP BY 列表中使用 CUBE ROLLUP ,來建立不同等級的聚集物化檢視。

物化檢視的一些特性:

定位導致物化檢視無法快速重新整理的原因: http://blog.itpub.net/post/468/13318

物化檢視的快速重新整理(一): http://blog.itpub.net/post/468/14245

物化檢視的快速重新整理(二): http://blog.itpub.net/post/468/16456

物化檢視的快速重新整理(三): http://blog.itpub.net/post/468/16496

物化檢視是包括一個查詢結果的資料庫對像,它是遠端資料的的本地副本,或者用來生成基於資料表求和的彙總表。物化檢視儲存基於遠端表的資料,也可以稱為快照。

物化檢視可以查詢表,檢視和其它的物化檢視。

通常情況下,物化檢視被稱為主表(在複製期間)或明細表(在資料倉儲中)。

對於複製,物化檢視允許你在本地維護遠端資料的副本 , 這些副本是隻讀的。如果你想修改本地副本,必須用高階複製的功能。當你想從一個表或檢視中抽取資料時,你可以用從物化檢視中抽取。

對於資料倉儲,建立的物化檢視通常情況下是聚合檢視,單一表聚合檢視和連線檢視。

本篇我們將會看到怎樣建立物化檢視並且討論它的重新整理選項。

在複製環境下,建立的物化檢視通常情況下主鍵, rowid, 和子查詢檢視。

1. 主鍵物化檢視:

下面的語法在遠端資料庫表 emp 上建立主鍵物化檢視

SQL> CREATE MATERIALIZED VIEW mv_emp_pk

REFRESH FAST START WITH SYSDATE

NEXT SYSDATE + 1/48

WITH PRIMARY KEY

AS SELECT * FROM emp@remote_db;

Materialized view created.

注意:當用 FAST 選項建立物化檢視,必須建立基於主表的檢視日誌 , 如下 :

SQL> CREATE MATERIALIZED VIEW LOG ON emp;

Materialized view log created.

2.Rowid 物化檢視

下面的語法在遠端資料庫表 emp 上建立 Rowid 物化檢視

SQL> CREATE MATERIALIZED VIEW mv_emp_rowid

REFRESH WITH ROWID

AS SELECT * FROM emp@remote_db;

Materialized view log created.

3. 子查詢物化檢視

下面的語法在遠端資料庫表 emp 上建立基於 emp dept 表的子查詢物化檢視

SQL> CREATE MATERIALIZED VIEW mv_empdept

AS SELECT * FROM emp@remote_db e

WHERE EXISTS

(SELECT * FROM dept@remote_db d

WHERE e.dept_no = d.dept_no)

Materialized view log created.

REFRESH 子句

[refresh [fast|complete|force]

[on demand | commit]

[start with date] [next date]

[with {primary key|rowid}]]

Refresh 選項說明 :

a. oracle 用重新整理方法在物化檢視中重新整理資料 .

b. 是基於主鍵還是基於 rowid 的物化檢視

c. 物化檢視的重新整理時間和間隔重新整理時間

Refresh 方法 -FAST 子句

增量重新整理用物化檢視日誌(參照上面所述)來傳送主表已經修改的資料行到物化檢視中 . 如果指定 REFRESH FAST 子句,那麼應該對主表建立物化檢視日誌

SQL> CREATE MATERIALIZED VIEW LOG ON emp;

Materialized view log created.

對於增量重新整理選項,如果在子查詢中存在分析函式,則物化檢視不起作用。

Refresh 方法 -COMPLETE 子句

完全重新整理重新生成整個檢視,如果請求完全重新整理, oracle 會完成完全重新整理即使增量重新整理可用。

Refresh Method FORCE 子句

當指定 FORCE 子句,如果增量重新整理可用 Oracle 將完成增量重新整理,否則將完成完全重新整理 , 如果不指定重新整理方法 (FAST, COMPLETE, or FORCE),Force 選項是預設選項

主鍵和 ROWD 子句

WITH PRIMARY KEY 選項生成主鍵物化檢視 , 也就是說物化檢視是基於主表的主鍵,而不是 ROWID( 對應於 ROWID 子句 ). PRIMARY KEY 是預設選項 , 為了生成 PRIMARY KEY 子句,應該在主表上定義主鍵,否則應該用基於 ROWID 的物化檢視 .

主鍵物化檢視允許識別物化檢視主表而不影響物化檢視增量重新整理的可用性。

Rowid 物化檢視只有一個單一的主表,不能包括下面任何一項 :

n Distinct 或者聚合函式 .

n Group by ,子查詢,連線和 SET 操作

重新整理時間

START WITH 子句通知資料庫完成從主表到本地表第一次複製的時間 , 應該及時估計下一次執行的時間點 , NEXT 子句說明了重新整理的間隔時間 .

SQL> CREATE MATERIALIZED VIEW mv_emp_pk

REFRESH FAST

START WITH SYSDATE

NEXT SYSDATE + 2

WITH PRIMARY KEY

AS SELECT * FROM emp@remote_db;

Materialized view created.

在上面的例子中,物化檢視資料的第一個副本在建立時生成,以後每兩天重新整理一次 .

總結

物化檢視提供了可伸縮的基於主鍵或 ROWID 的檢視 , 指定了重新整理方法和自動重新整理的時間。

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

相關文章