Oracle的物化視圖

          Posted on 2007-01-15 12:05 weibogao 閱讀(1677) 評(píng)論(0)  編輯  收藏 所屬分類: database development

          Oracle 的物化視圖提供了強(qiáng)大的功能,可以用在不同的環(huán)境中。在不同的環(huán)境中,物化視圖的作用也不相同。

          數(shù)據(jù)倉(cāng)庫(kù)中的物化視圖主要用于預(yù)先計(jì)算并保存表連接或聚集等耗時(shí)較多的操作的結(jié)果,這樣,在執(zhí)行查詢時(shí),就可以避免進(jìn)行這些耗時(shí)的操作,而從快速的得到結(jié)果。在數(shù)據(jù)倉(cāng)庫(kù)中,還經(jīng)常使用查詢重寫( query rewrite )機(jī)制,這樣不需要修改原有的查詢語句, Oracle 會(huì)自動(dòng)選擇合適的物化視圖進(jìn)行查詢,完全對(duì)應(yīng)用透明。

          物化視圖和表一樣可以直接進(jìn)行查詢。物化視圖可以基于分區(qū)表,物化視圖本身也可以分區(qū)。

          除了在數(shù)據(jù)倉(cāng)庫(kù)中使用,物化視圖還用于復(fù)制、移動(dòng)計(jì)算等方面。

          物化視圖有很多方面和索引很相似:使用物化視圖的目的是為了提高查詢性能;物化視圖對(duì)應(yīng)用透明,增加和刪除物化視圖不會(huì)影響應(yīng)用程序中 SQL 語句的正確性和有效性;物化視圖需要占用存儲(chǔ)空間;當(dāng)基表發(fā)生變化時(shí),物化視圖也應(yīng)當(dāng)刷新。

          物化視圖可以分為以下三種類型:包含聚集的物化視圖;只包含連接的物化視圖;嵌套物化視圖。三種物化視圖的快速刷新的限制條件有很大區(qū)別,而對(duì)于其他方面則區(qū)別不大。

          創(chuàng)建物化視圖時(shí)可以指定多種選項(xiàng),下面對(duì)幾種主要的選擇進(jìn)行簡(jiǎn)單說明:

          創(chuàng)建方式( Build Methods ):包括 BUILD IMMEDIATE BUILD DEFERRED 兩種。 BUILD IMMEDIATE 是在創(chuàng)建物化視圖的時(shí)候就生成數(shù)據(jù),而 BUILD DEFERRED 則在創(chuàng)建時(shí)不生成數(shù)據(jù),以后根據(jù)需要在生成數(shù)據(jù)。默認(rèn)為 BUILD IMMEDIATE 。

          查詢重寫( Query Rewrite ):包括 ENABLE QUERY REWRITE DISABLE QUERY REWRITE 兩種。分別指出創(chuàng)建的物化視圖是否支持查詢重寫。查詢重寫是指當(dāng)對(duì)物化視圖的基表進(jìn)行查詢時(shí), Oracle 會(huì)自動(dòng)判斷能否通過查詢物化視圖來得到結(jié)果,如果可以,則避免了聚集或連接操作,而直接從已經(jīng)計(jì)算好的物化視圖中讀取數(shù)據(jù)。默認(rèn)為 DISABLE QUERY REWRITE 。

          刷新( Refresh ):指當(dāng)基表發(fā)生了 DML 操作后,物化視圖何時(shí)采用哪種方式和基表進(jìn)行同步。刷新的模式有兩種: ON DEMAND ON COMMIT 。 ON DEMAND 指物化視圖在用戶需要的時(shí)候進(jìn)行刷新,可以手工通過 DBMS_MVIEW.REFRESH 等方法來進(jìn)行刷新,也可以通過 JOB 定時(shí)進(jìn)行刷新。 ON COMMIT 指出物化視圖在對(duì)基表的 DML 操作提交的同時(shí)進(jìn)行刷新。刷新的方法有四種: FAST 、 COMPLETE 、 FORCE NEVER 。 FAST 刷新采用增量刷新,只刷新自上次刷新以后進(jìn)行的修改。 COMPLETE 刷新對(duì)整個(gè)物化視圖進(jìn)行完全的刷新。如果選擇 FORCE 方式,則 Oracle 在刷新時(shí)會(huì)去判斷是否可以進(jìn)行快速刷新,如果可以則采用 FAST 方式,否則采用 COMPLETE 的方式。 NEVER 指物化視圖不進(jìn)行任何刷新。默認(rèn)值是 FORCE ON DEMAND 。

          在建立物化視圖的時(shí)候可以指定 ORDER BY 語句,使生成的數(shù)據(jù)按照一定的順序進(jìn)行保存。不過這個(gè)語句不會(huì)寫入物化視圖的定義中,而且對(duì)以后的刷新也無效。

          物化視圖日志:如果需要進(jìn)行快速刷新,則需要建立物化視圖日志。物化視圖日志根據(jù)不同物化視圖的快速刷新的需要,可以建立為 ROWID PRIMARY KEY 類型的。還可以選擇是否包括 SEQUENCE 、 INCLUDING NEW VALUES 以及指定列的列表。

          可以指明 ON PREBUILD TABLE 語句將物化視圖建立在一個(gè)已經(jīng)存在的表上。這種情況下,物化視圖和表必須同名。當(dāng)刪除物化視圖時(shí),不會(huì)刪除同名的表。這種物化視圖的查詢重寫要求參數(shù) QUERY_REWRITE_INTEGERITY 必須設(shè)置為 trusted 或者 stale_tolerated

          物化視圖可以進(jìn)行分區(qū)。而且基于分區(qū)的物化視圖可以支持分區(qū)變化跟蹤( PCT )。具有這種特性的物化視圖,當(dāng)基表進(jìn)行了分區(qū)維護(hù)操作后,仍然可以進(jìn)行快速刷新操作。

          對(duì)于聚集物化視圖,可以在 GROUP BY 列表中使用 CUBE ROLLUP ,來建立不同等級(jí)的聚集物化視圖。

          物化視圖的一些特性:

          定位導(dǎo)致物化視圖無法快速刷新的原因: 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

          ?

          物化視圖是包括一個(gè)查詢結(jié)果的數(shù)據(jù)庫(kù)對(duì)像,它是遠(yuǎn)程數(shù)據(jù)的的本地副本,或者用來生成基于數(shù)據(jù)表求和的匯總表。物化視圖存儲(chǔ)基于遠(yuǎn)程表的數(shù)據(jù),也可以稱為快照。

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

          通常情況下,物化視圖被稱為主表(在復(fù)制期間)或明細(xì)表(在數(shù)據(jù)倉(cāng)庫(kù)中)。

          對(duì)于復(fù)制,物化視圖允許你在本地維護(hù)遠(yuǎn)程數(shù)據(jù)的副本 , 這些副本是只讀的。如果你想修改本地副本,必須用高級(jí)復(fù)制的功能。當(dāng)你想從一個(gè)表或視圖中抽取數(shù)據(jù)時(shí),你可以用從物化視圖中抽取。

          對(duì)于數(shù)據(jù)倉(cāng)庫(kù),創(chuàng)建的物化視圖通常情況下是聚合視圖,單一表聚合視圖和連接視圖。

          本篇我們將會(huì)看到怎樣創(chuàng)建物化視圖并且討論它的刷新選項(xiàng)。

          在復(fù)制環(huán)境下,創(chuàng)建的物化視圖通常情況下主鍵, rowid, 和子查詢視圖。

          1. 主鍵物化視圖:

          下面的語法在遠(yuǎn)程數(shù)據(jù)庫(kù)表 emp 上創(chuàng)建主鍵物化視圖

          ??????? 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.

          ????????????? 注意:當(dāng)用 FAST 選項(xiàng)創(chuàng)建物化視圖,必須創(chuàng)建基于主表的視圖日志 , 如下 :

          ??????????? SQL> CREATE MATERIALIZED VIEW LOG ON emp;

          ??????????? Materialized view log created.

          2.Rowid 物化視圖

          ????????????? 下面的語法在遠(yuǎn)程數(shù)據(jù)庫(kù)表 emp 上創(chuàng)建 Rowid 物化視圖

          ????? SQL> CREATE MATERIALIZED VIEW mv_emp_rowid

          ??????????? REFRESH WITH ROWID

          ???????????? AS SELECT * FROM emp@remote_db;

          ??????????? Materialized view log created.

          3. 子查詢物化視圖

          ????????????? 下面的語法在遠(yuǎn)程數(shù)據(jù)庫(kù)表 emp 上創(chuàng)建基于 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 選項(xiàng)說明 :

          a.????? oracle 用刷新方法在物化視圖中刷新數(shù)據(jù) .

          b.????? 是基于主鍵還是基于 rowid 的物化視圖

          c.?????? 物化視圖的刷新時(shí)間和間隔刷新時(shí)間

          Refresh 方法 -FAST 子句

          ?????? 增量刷新用物化視圖日志(參照上面所述)來發(fā)送主表已經(jīng)修改的數(shù)據(jù)行到物化視圖中 . 如果指定 REFRESH FAST 子句,那么應(yīng)該對(duì)主表創(chuàng)建物化視圖日志

          ??????????????????? SQL> CREATE MATERIALIZED VIEW LOG ON emp;

          Materialized view log created.

          對(duì)于增量刷新選項(xiàng),如果在子查詢中存在分析函數(shù),則物化視圖不起作用。

          Refresh 方法 -COMPLETE 子句

          完全刷新重新生成整個(gè)視圖,如果請(qǐng)求完全刷新, oracle 會(huì)完成完全刷新即使增量刷新可用。

          Refresh Method FORCE 子句

          當(dāng)指定 FORCE 子句,如果增量刷新可用 Oracle 將完成增量刷新,否則將完成完全刷新 , 如果不指定刷新方法 (FAST, COMPLETE, or FORCE),Force 選項(xiàng)是默認(rèn)選項(xiàng)

          主鍵和 ROWD 子句

          WITH PRIMARY KEY 選項(xiàng)生成主鍵物化視圖 , 也就是說物化視圖是基于主表的主鍵,而不是 ROWID( 對(duì)應(yīng)于 ROWID 子句 ). PRIMARY KEY 是默認(rèn)選項(xiàng) , 為了生成 PRIMARY KEY 子句,應(yīng)該在主表上定義主鍵,否則應(yīng)該用基于 ROWID 的物化視圖 .

          主鍵物化視圖允許識(shí)別物化視圖主表而不影響物化視圖增量刷新的可用性。

          Rowid 物化視圖只有一個(gè)單一的主表,不能包括下面任何一項(xiàng) :

          n???????? Distinct 或者聚合函數(shù) .

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

          刷新時(shí)間 ??????

          START WITH 子句通知數(shù)據(jù)庫(kù)完成從主表到本地表第一次復(fù)制的時(shí)間 , 應(yīng)該及時(shí)估計(jì)下一次運(yùn)行的時(shí)間點(diǎn) , NEXT 子句說明了刷新的間隔時(shí)間 .

          ??????????? 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.

          在上面的例子中,物化視圖數(shù)據(jù)的第一個(gè)副本在創(chuàng)建時(shí)生成,以后每?jī)商焖⑿乱淮?/span> .

          總結(jié)

          物化視圖提供了可伸縮的基于主鍵或 ROWID 的視圖 , 指定了刷新方法和自動(dòng)刷新的時(shí)間。

          ?

          posts - 41, comments - 7, trackbacks - 0, articles - 0

          Copyright © weibogao

          主站蜘蛛池模板: 永福县| 东海县| 长岛县| 晋江市| 宣武区| 抚远县| 和静县| 北海市| 宁夏| 扬州市| 大悟县| 吉隆县| 绥化市| 黄浦区| 惠安县| 呼伦贝尔市| 黎城县| 嘉义县| 镇康县| 固原市| 阳江市| 屏山县| 饶河县| 乐安县| 延边| 洪湖市| 桐庐县| 璧山县| 松原市| 儋州市| 柳林县| 浦县| 五原县| 九寨沟县| 绥芬河市| 炎陵县| 金塔县| 河西区| 南宫市| 二连浩特市| 师宗县|