1. 程式人生 > >物化檢視重新整理原理與效能診斷

物化檢視重新整理原理與效能診斷

參考文件:Materialized View Refresh: Locking, Performance, Monitoring (文件 ID 258252.1)

How to Monitor the Progress of a Materialized View Refresh (MVIEW) (文件 ID 258021.1)

1、名詞解釋:基表指的是英文裡面的Master Table和Master Materialized View,並不只是只一個表,而是建立MView的時候所需要用到的n個表或者是相關的上一級的MView。MView就是Materialized View了,物化檢視。源資料庫端
Master Site和Master Materialized View Site,指的是基表所在的資料庫MView端Materialized View Site,MView所在的資料庫

2、常見用法:

例子:

SQL>create materialized view log on table_tst;

SQL>create materialized view table_tst [on prebuilt table]  refresh   fast as select * from [email protected]_db_master

SQL>exec dbms_mview.refresh('table_tst',method => 'Complete');

SQL>exec dbms_mview.refresh('table_tst'); 

SQL> declare jobid number;

begin

sys.dbms_job.submit(job => jobid,

what => 'dbms_mview.refresh(''table_tst'');',

next_date => sysdate,

interval => 'sysdate+5/1440');

commit;

end;

 /

其中

第1步是在需要複製的主表(master table)上建立mv log。

第2步是在遠端站點(想複製到的那個站點)上建立mv,注意,如果選擇了選項on prebuild table的話,表示在已經存在的表上建立mv,需要已經存在的表的欄位與select的欄位必須要對應,這個已經存在的表中可以沒有資料。

第3步是全同步,如果沒有選擇on prebuild table,這一步可以省略,因為預設建立mv的時候,就會全重新整理

第4步是增量重新整理,在完成全重新整理以後的情況下,一般都只需要做增量重新整理即可。

第5步是建立一個自動重新整理的作業來進行重新整理,如每5分鐘重新整理一次,這個操作也可以同crontab來代替。

我們舉個測試栗子:

建立帶有主鍵的表(不能用sys使用者,因為sys使用者的表不能建立mv 日誌):ORA-12010: 不能在 SYS 擁有的表上建立實體化檢視日誌。
create table table_tst (a int, b varchar2(50), constraint pk_tst primary key(a));
 
建立對應的MV名為
create materialized view table_tst_mv as select * from table_tst;

此時表SYS.SNAP$中多了一條新記錄:



建立檢視日誌:
create materialized view log on table_tst;
此時表sys.MLOG$中多了一條新記錄:



向表中插入資料:
insert into table_tst select rownum, object_name from all_objects;


檢查當前表和物化視圖裡的資料是否一致:
select count(*) from table_tst
 COUNT(*)
----------
     85722


select count(*) from table_tst_mv
  COUNT(*)
----------
0

重新整理到物化檢視:
exec dbms_mview.refresh('table_tst_mv');

SQL> select count(*) from table_tst_mv;

  COUNT(*)
----------
      85722

此時物化檢視已經重新整理了,在看下記錄表(已經記錄了現在youngest的時間,最新時間):


同事sys.SNAP$ 裡面也記錄了最新RSCN:



在實際應用的環境中表T和MView MVT並不是在同一個機器上,而是分散在兩個以上的機器上,同時基表也可能不止一個,可能存在多個。

下面列舉了MView在實際中的主要作用:

  • 減輕網路負擔:通過MV將資料從一個數據庫分發到多個不同的資料庫上,通過對多個數據庫訪問來減輕對單個數據庫的網路負擔。
  • 搭建分發環境:通過從一箇中央資料庫將資料分發到多個節點資料庫,達到分發資料的目的。
  • 複製資料子集:MV可以進行行級/列級的篩選,這樣可以複製需要的那一部分資料。
  • 支援離線計算:MV不需要專用的資料庫連線,使用者可以按照自己的需求來複制所需要的那一部分資料。

3、物化檢視相關的重要的表:

dba_mviews記錄了遠端站點上mv的數目與屬性,需要在建立MV的站點上查詢。

sys.mlog$ 則記錄了主站點上的mv的log數目,如果一個master對應到多個站點,也只有一條記錄,對應到dba_mview_logs檢視,需要在主站點查詢。

sys.slog$記錄了主站點上已經註冊成功的主表資訊,如果一個主表被複制到多個站點,則對應多條記錄,在主站點查詢。

dba_snapshot_logs存放了mv的log日誌,如果對應到多個站點,則每個站點都對應一條記錄,因為遠端站點的snapshot_id是不一樣的。其實sys.mlog$與sys.slog$的關聯就是組成dba_snapshot_logs的一個部分,通過查詢dba_views可以看到其指令碼。

dba_registered_snapshots記錄了遠端站點的註冊資訊,只記錄註冊成功的遠端站點,通過snapshot_id可以與dba_snapshot_logs關聯。


4、物化檢視重新整理的方式:

下面接著說說MView重新整理這個事。

MView裡面的資料是不會和基表保持實時的同步的,它只是基表在某時時間點(重新整理的時間點)的一個一致性的資料的映象,因此,要保持MView儘可能的和基表同步的話就需要我們定期的對MView進行重新整理。


MView重新整理的分類

Oracle支援三種種方式的重新整理:完全重新整理快速重新整理以及強制重新整理

完全重新整理(complete refresh)

對一個MView進行全部重新整理的時候差不多是將MView重建了,在進行MView全部重新整理的時候會現將MView中現有的資料刪除(版本在10G或以上)或者TRUNCATE(版本低於9i),然後在根據建立MView時候的查詢生成資料插入到MView中。

對於多層的MView來說,當master MView全部重新整理之後對應的下一級的MView也需要全部重新整理,否則將會收到ORA-12034的錯誤。

快速重新整理(fast refresh)

快速重新整理是一種比完全重新整理快的多的重新整理方式,快速重新整理只重新整理自上次重新整理以來修改的資料,因為快速重新整理所要操作的資料量少,使用這種方法能大大的節省頻寬.快速重新整理要求在基表上面有MView Log。

execdbms_mview.refresh('table_tst_mv''F');

強制重新整理(force refresh)

當進行強制重新整理的時候系統會首先嚐試進行快速重新整理,如果快速重新整理無法進行的時候系統將會進行完全重新整理。其實就是一個快速重新整理和完全重新整理的結合體。


指定重新整理方式

既然有那麼多種的重新整理方式那我們怎麼指定他們呢?

在Oracle中有兩種方法來制定所用的重新整理方式,第一種在上面我們已經看過了,就是在執行重新整理MView語句的時候制定重新整理方式,比如說

execdbms_mview.refresh('table_tst_mv''F');

用來指定對MView mvt進行快速重新整理,將其中的”F”改成”C”就是指定對mvt進行完全重新整理了。

execdbms_mview.refresh('table_tst_mv''C');

另外一種方法是直接執行

execdbms_mview.refresh('table_tst_mv');

就是不指定重新整理的引數,這個時候MView的重新整理方式將是根據建立時候由REFRESH語句指定的重新整理方法來進行重新整理了,REFRESH語句一共有下面幾種使用方法

[refresh [fast | complete | force]
  ......
  ]
  • FAST: 採用增量重新整理,只重新整理自上次重新整理以後進行的修改
  • COMPLETE: 對整個實體化檢視進行完全的重新整理
  • FORCE(預設): Oracle在重新整理時會去判斷是否可以進行快速重新整理,如果可以則採用Fast方式,否則採用Complete的方式,Force選項是預設選項


什麼時候重新整理

現在怎麼重新整理的問題解決了,接下來就是考慮我們什麼時候進行重新整理了。

我們從上面已經知道我們需要定期的對MView進行重新整理以保證基表和MView的資料同步,這個定期的方法就是使用job,同樣我們有兩種方法來建立重新整理MView的job。

使用DBMS_JOB包來建立

-- 提交一個JOB用來重新整理MViewUSER@orclvariablejob1number;
USER@orclexecdbms_job.submit(:job1,'dbms_mview.refresh(''"user"."table_tst_mv"'');',sysdate,'sysdate+1/24');
PL/SQLproceduresuccessfullycompleted.
 
USER@orclcommit;
Commitcomplete.
 
-- 檢視一下結果USER@orclselectJOB,NEXT_DATE,NEXT_SEC,INTERVAL,WHATfromuser_jobs;
       
JOBNEXT_DATENEXT_SECINTERVALWHAT
--------
-- ------------------- ------------------------ ------------------------------ ----------------------------------------232009-01-1313:52:1413:52:14sysdate+1/24dbms_mview.refresh('"user"."table_tst_mv"');

使用這種方法相對下面的方法來說不同之處在於這種方法可以自己指定重新整理的語句,這樣靈活性相對高一些。

在建立MView的時候指定REFRESH語句

沒錯,還是REFRESH語句,這個語句的用法還是挺多的,下面列出這個語句的其他用法:

[refresh ......
         [
startwithdate]
         [
nextdate]
  ......
  ]
  • START WITH: 第一次重新整理時間
  • NEXT: 重新整理時間間隔

說明:指定上面兩個選項的任意一個都將會在系統中產生一個新的JOB,用來對所建立的MV進行重新整理,這個JOB可以從DBA_JOBS查到,同時刪除MV之後該JOB也會被刪除。下面我們看一個例子:

-- 建立一個MView,並指定重新整理時間為sysdate和重新整理間隔為一個小時creatematerializedviewmvt2 refreshstartwithsysdate nextsysdate+1/24asselect * fromt;
Materializedviewcreated.

每兩個小時重新整理一次

CREATE MATERIALIZED VIEW mvt2
refresh complete
Start With Sysdate Next trunc(sysdate, 'HH24')+1/12
as 
select * from users where isbest=1;
start with指定第一次同步的時間,next則是下次執行時間了
-- 現在我們看一下job-- 請注意這裡的WHAT那一欄中MView重新整理的程式碼是不帶重新整理方式的,也就是說按照建立時候的重新整理方式進行重新整理USER@orclselectJOB,NEXT_DATE,NEXT_SEC,INTERVAL,WHATfromuser_jobs;
JOBNEXT_DATENEXT_SECINTERVALWHAT
-
-- ------------------- --------- ------------- ----------------------------------------212009-01-1313:20:2013:20:20sysdate+1/24dbms_refresh.refresh('"USER"."MVT2"');

另外這裡所說的JOB定時重新整理只是針對於單個MView來說的,而對於存在多個MView要重新整理的時候我們就要開始考慮重新整理組了,這個部分以後再慢慢說明。

相關推薦

物化檢視重新整理原理效能診斷

參考文件:Materialized View Refresh: Locking, Performance, Monitoring (文件 ID 258252.1)How to Monitor the Progress of a Materialized View Refres

物化檢視重新整理失敗導致日誌表異常增大

OWNER NAME MVIEW_SITE CAN_USE_LOG UPDATABLE REFRESH_METHOD MVIEW_ID VERSION QUERY_TXT------------------------------ ------------------------------ --------

LoRa學習:LoRa通訊調製解調的實現原理效能

LoRa學習:LoRa調製解調原理與效能 1、LoRa調變解調器原理 LoRa調變解調器採用專利擴頻調製和前向糾錯技術。與傳統的FSK、OOK調製技術相比,LoRa擴大了無線通訊鏈路的覆蓋範圍(實現了遠距離無線傳輸),提高了鏈路的魯棒性。。 開發人員可調整擴

Oracle 物化檢視日誌 快速重新整理 說明

一.物化檢視日誌格式說明 Oracle 物化檢視說明 Oracle 物化檢視 詳細錯誤描述 檢視方法 Oracle 物化檢視 快速重新整理 限制 說明 Oracle 的物化檢視的快速重新整理要求必須建立物化檢視日誌,通過物化檢視日誌可以實現增量重新整理功能

OpenCV學習筆記(30)KAZE 演算法原理原始碼分析(四)KAZE特徵的效能分析比較

      KAZE系列筆記: 1.  OpenCV學習筆記(27)KAZE 演算法原理與原始碼分析(一)非線性擴散濾波 2.  OpenCV學習筆記(28)KAZE 演算法原理與原始碼分析(二)非線性尺度空間構

暫停正在自動重新整理的oracle物化檢視的方法

       原理:要暫停正在重新整理的物化檢視只需要殺死對應的會話就好了,但是物化檢視重新整理是通過oracle的job定時執行,會話被kill之後,job會重新的執行重新整理物化檢視操作,因此在kill會話之前需要把job的狀態broken設定為Y,表

易學筆記-系統分析師考試-第6章 系統配置效能評價/6.5 流水線技術/6.5.1 流水線工作原理

增加計算機效能的主要途徑 空間並行性:一個處理機內設定多個獨立的操作部件並行工作 時間並行性:採用流水線技術實現 流水線工作原理 流水線技術概念: 把一個任務分解為多個順序執行的子任務,不同的子任務由不同的操作部件並行執行

DB2資料庫故障效能瓶頸診斷思路小記一

本文主要介紹了db2資料庫在遇到故障及效能問題時運用什麼方法去快速診斷定位問題,希望本文內容可以為從事db2的網友提供一些指導和參考 。 1、在db2資料庫主機遇到重大故障時我們可以通過db2support收集資料庫診斷日誌資料 #在可以連線的時候 #db2support .

Netty學習之旅----ThreadLocal原理分析效能優化思考(思考篇)

/** * Returns the value in the current thread's copy of this * thread-local variable. If the variable has no value for the

物化檢視的定義,建立,重新整理,刪除等

一. 物化檢視概述 Oracle的物化檢視是包括一個查詢結果的資料庫對像,它是遠端資料的的本地副本,或者用來生成基於資料表求和的彙總表。物化檢視儲存基於遠端表的資料,也可以稱為快照。 物化檢視可以用於預先計算並儲存表連線或聚集等耗時較多的操作的結果,這樣,在執行查詢時

由淺入深探究mysql索引結構原理效能分析優化

第一部分:基礎知識 第二部分:MYISAM和INNODB索引結構 1、 簡單介紹B-tree B+ tree樹 2、 MyisAM索引結構 3、 Annode索引結構 4、 MyisAM索引與InnoDB索引相比較 第三部分:MYSQL優化 1、表資料型別選擇 2、sql語句優化 (1)     最左字首

效能優化】quicklink:實現原理給前端的啟發

近來,GoogleChromeLabs 推出了 quicklink,用以實現連結資源的預載入(prefetch)。本文在介紹其實現思路的基礎上,會進一步探討在預載入方面前端工程師還可以做什麼。 1. quicklink 是什麼的? quicklink 是一個通過預載入資源來提升後續方案速度的輕量級工具庫。

效能計數器profiler的組合效能診斷

  效能計數器和sql profiler都是常用的效能診斷工具和優化工具,最近和群友聊天發現很多人竟然不知道這兩個可以“組合”使用,所以這篇算是一篇掃盲貼吧。 兩種工具簡述   通過計數器可以收集兩部分內容:WINDOWS 的執行指標,和SQL Server的指標。比如:伺服器的CPU使用率、磁碟佇列、記

前端效能優化原理實踐

在當下迭代飛快的網際網路環境下,效能優劣至關重要,差的效能足以摧毀一個好的網站。具體到 Web

【ORACLE】物化檢視快速重新整理限制條件

快速重新整理的物化檢視建立比較麻煩,限制條件比較多,本文參考Oracle 11g 11.2版本官方文件,總結一般情況、含有聯接、含有聚合計算、UNION ALL等情況下的限制條件。 所有快速重新整理的物化檢視都必須滿足的條件 定義物化檢視的查詢語句限制如

Oracle物化檢視原理例項解析

最近專案上需要資料庫表優化,看了對大資料量的表進行線上重定義進行分割槽,偶然看到物化檢視的概念,感覺也十分有用,這篇文章寫的能看懂故轉載 出處 http://leonarding.blog.51cto.com/6045525/1354990場合:資料變化小,查詢出資料還要2

『ORACLE』快速重新整理物化檢視的方法(11g)

1、on demand:使用DBMS_MVIEW包中的儲存過程啟用手工重新整理(預設設定) refresh [fast|complete|force] 檢視重新整理的方式: complete:全部重新整理。相當於重新執行一次建立檢視的查詢語句。 fast: 增量重新

Oracle物化檢視定時全量重新整理導致歸檔日誌驟增

1.全量重新整理時,將產生較多的REDO,以上面的情況為例,如果該物化檢視每5分鐘重新整理一次,則全天將產生約10656M(約10G,以不帶索引,37M計算)的歸檔日誌資料。   2、當該物化檢視上有索引時,歸檔日誌的資料將更大

深入解析:Row Movement 的原理效能影響關聯

ROW MOVEMENT特性最初是在8i時引入的,其目的是提高分割槽表的靈活性——允許更新Partition Key。這一特性 預設是關閉,只是在使用到一些特殊功能時會要求開啟。除了之前提到的更新Partition Key,還有2個要求開啟的ROW MOVEMENT的功能就是flushback

oracle中Job定期執行儲存過程重新整理物化檢視並記錄異常(我的物化檢視不能自己刷)

(一)問題: 最近一個專案,我們的系統中需要處理老資料,但是有一些客觀限制:(都是Oracle11.2.0.2) (1)這些老資料儲存在人家的資料庫中 (2)這些老資料還會持續更新 (3)不能動人家的資料庫 (4)我們需要針對人家的資料庫中的兩張表做左連結 最終我們決定用D