1. 程式人生 > >ORACLE物化檢視-看這一篇就可以了,看完全懂

ORACLE物化檢視-看這一篇就可以了,看完全懂

快速:

一、物化檢視的建立

create materialized view [view_name] 
refresh [fast|complete|force] 

on [commit|demand] | 
start with (start_time) next (next_time) 

as 
{建立物化檢視用的查詢語句} 

具體例項如下: 

CREATE MATERIALIZED VIEW an_user_base_file_no_charge 
             REFRESH COMPLETE START WITH SYSDATE 
            NEXT TRUNC(SYSDATE+29)+5.5/24    --紅色部分表示從指定的時間開始,每隔一段時間(由next指定)就重新整理一次 

AS 
select distinct user_no 
from cw_arrearage t 
where (t.mon = dbms_tianjin.getLastMonth or 
       t.mon = add_months(dbms_tianjin.getLastMonth, -1)) 
刪除物化檢視: 
drop materialized view an_user_base_file_no_charge; 

以上是Oracle建立物化檢視(Materialized View,以下簡稱MV)時的常用語法,各引數的含義如下: 

1.refresh [fast|complete|force] 檢視重新整理的方式: 

fast: 增量重新整理.假設前一次重新整理的時間為t1,那麼使用fast模式重新整理物化檢視時,只向檢視中新增t1到當前時間段內,主表變化過的資料.為了記錄這種變化,建立增量重新整理物化檢視還需要一個物化檢視日誌表。create materialized view log on (主表名)。 
complete:全部重新整理。相當於重新執行一次建立檢視的查詢語句。 
force: 這是預設的資料重新整理方式。當可以使用fast模式時,資料重新整理將採用fast方式;否則使用complete方式。 

2.MV資料重新整理的時間: 
on demand:在使用者需要重新整理的時候重新整理,這裡就要求使用者自己動手去重新整理資料了(也可以使用job定時重新整理) 

on commit:當主表中有資料提交的時候,立即重新整理MV中的資料; 
start ……:從指定的時間開始,每隔一段時間(由next指定)就重新整理一次; 

手動重新整理物化檢視: 
begin 
     dbms_mview.refresh(TAB=>'an_user_base_file_no_charge', 
                                       METHOD=>'COMPLETE', 
                                       PARALLELISM=>8);   --PARALLELISM並行控制引數 
end; 


增量重新整理就不需要使用什麼並行了,通常情況下,是沒有那個必要的。 

begin 
     dbms_mview.refresh(TAB=>'an_user_base_file_no_charge', 
                                       METHOD=>'FAST', 
                                       PARALLELISM=>1); 
end; 


詳解:

一、物化的一般用法物化檢視是一種特殊的物理表,“物化”(Materialized)檢視是相對普通檢視而言的。普通檢視是虛擬表,應用的侷限性大,任何對檢視的查詢,oracle都實際上轉換為檢視SQL語句的查詢。這樣對整體查詢效能的提高,並沒有實質上的好處。

1、物化檢視的型別ON DEMAND、ON COMMIT。二者的區別在於重新整理方法的不同,ON DEMAND顧名思義,僅在該物化檢視“需要”被重新整理了,才進行重新整理(REFRESH),即更新物化檢視,以保證和基表資料的一致性;而ON COMMIT是說,一旦基表有了COMMIT,即事務提交,則立刻重新整理,立刻更新物化檢視,使得資料和基表一致。
物化檢視可以分為以下三種類型:包含聚集的物化檢視;只包含連線的物化檢視;巢狀物化檢視。三種物化檢視的快速重新整理的限制條件有很大區別,而對於其他方面則區別不大。建立物化檢視時可以指定多種選項,下面對幾種主要的選擇進行簡單說明:
建立方式(Build Methods):包括BUILD IMMEDIATE和BUILD DEFERRED兩種。BUILD IMMEDIATE是在建立物化檢視的時候就生成資料,而BUILD DEFERRED則在建立時不生成資料,以後根據需要在生成資料。預設為BUILD IMMEDIATE。
查詢重寫(Query Rewrite):包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE兩種。分別指出建立的物化檢視是否支援查詢重寫。查詢重寫是指當對物化檢視的基表進行查詢時,Oracle會自動判斷能否通過查詢物化檢視來得到結果,如果可以,則避免了聚集或連線操作,而直接從已經計算好的物化檢視中讀取資料。預設為DISABLE QUERY REWRITE。
在建立物化檢視的時候可以指定ORDER BY語句,使生成的資料按照一定的順序進行儲存。不過這個語句不會寫入物化檢視的定義中,而且對以後的重新整理也無效。
2、ON DEMAND物化檢視物化檢視的建立本身是很複雜和需要優化引數設定的,特別是針對大型生產資料庫系統而言。但Oracle允許以這種最簡單的,類似於普通檢視的方式來做,所以不可避免的會涉及到預設值問題。也就是說Oracle給物化檢視的重要定義引數的預設值處理是我們需要特別注意的。物化檢視的特點:
(1) 物化檢視在某種意義上說就是一個物理表(而且不僅僅是一個物理表),這通過其可以被user_tables查詢出來,而得到佐證;
(2) 物化檢視也是一種段(segment),所以其有自己的物理儲存屬性;
(3) 物化檢視會佔用資料庫磁碟空間,這點從user_segment的查詢結果,可以得到佐證;
建立語句:
SQL> create materialized view mv_name as select * from table_name;
預設情況下,如果沒指定重新整理方法和重新整理模式,則Oracle預設為FORCE和DEMAND。
物化檢視的資料怎麼隨著基表而更新?
Oracle提供了兩種方式,手工重新整理和自動重新整理,預設為手工重新整理。也就是說,通過我們手工的執行某個Oracle提供的系統級儲存過程或包,來保證物化檢視與基表資料一致性。這是最基本的重新整理辦法了。自動重新整理,其實也就是Oracle會建立一個job,通過這個job來呼叫相同的儲存過程或包,加以實現。
ON DEMAND物化檢視的特性及其和ON COMMIT物化檢視的區別,即前者不重新整理(手工或自動)就不更新物化檢視,而後者不重新整理也會更新物化檢視,——只要基表發生了COMMIT。
建立定時重新整理的物化檢視(指定物化檢視每天重新整理一次):
SQL> create materialized view mv_name refresh force on demand start with sysdate next sysdate+1;
上述建立的物化檢視每天重新整理,但是沒有指定重新整理時間,如果要指定重新整理時間(比如每天晚上10:00定時重新整理一次):
SQL> create materialized view mv_name refresh force on demand start with sysdate next to_date( concat( to_char( sysdate+1,'dd-mm-yyyy'),' 22:00:00'),'dd-mm-yyyy hh24:mi:ss');
3、ON COMMIT物化檢視ON COMMIT物化檢視的建立,和上面建立ON DEMAND的物化檢視區別不大。因為ON DEMAND是預設的,所以ON COMMIT物化檢視,需要再增加個引數即可。
需要注意的是,無法在定義時僅指定ON COMMIT,還得附帶個引數才行。建立ON COMMIT物化檢視:
SQL> create materialized view mv_name refresh force on commit as select * from table_name;
備註:實際建立過程中,基表需要有主鍵約束,否則會報錯(ORA-12014)。
4、物化檢視的重新整理重新整理(Refresh):指當基表發生了DML操作後,物化檢視何時採用哪種方式和基表進行同步。
重新整理的模式有兩種:ON DEMAND和ON COMMIT。
重新整理的方法有四種:FAST、COMPLETE、FORCE和NEVER。FAST重新整理採用增量重新整理,只重新整理自上次重新整理以後進行的修改。COMPLETE重新整理對整個物化檢視進行完全的重新整理。如果選擇FORCE方式,則Oracle在重新整理時會去判斷是否可以進行快速重新整理,如果可以則採用FAST方式,否則採用COMPLETE的方式。NEVER指物化檢視不進行任何重新整理。
對於已經建立好的物化檢視,可以修改其重新整理方式,比如把物化檢視mv_name的重新整理方式修改為每天晚上10點重新整理一次:
SQL> alter materialized view mv_name refresh force on demand start with sysdate next to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),' 22:00:00'),'dd-mm-yyyy hh24:mi:ss');
5、物化檢視日誌如果需要進行快速重新整理,則需要建立物化檢視日誌。物化檢視日誌根據不同物化檢視的快速重新整理的需要,可以建立為ROWID或PRIMARY KEY型別的。還可以選擇是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。
可以指明ON PREBUILD TABLE語句將物化檢視建立在一個已經存在的表上。這種情況下,物化檢視和表必須同名。當刪除物化檢視時,不會刪除同名的表。這種物化檢視的查詢重寫要求引數QUERY_REWRITE_INTEGERITY必須設定為trusted或者stale_tolerated。
6、物化檢視分割槽而且基於分割槽的物化檢視可以支援分割槽變化跟蹤(PCT)。具有這種特性的物化檢視,當基表進行了分割槽維護操作後,仍然可以進行快速重新整理操作。對於聚集物化檢視,可以在GROUP BY列表中使用CUBE或ROLLUP,來建立不同等級的聚集物化檢視。
二、物化檢視與資料遷移Oracle 的物化檢視提供了強大的功能,可以用於預先計算並儲存表連線或聚集等耗時較多的操作的結果,這樣,在執行查詢時,就可以避免進行這些耗時的操作,而從快速的得到結果。物化檢視有很多方面和索引很相似:使用物化檢視的目的是為了提高查詢效能;物化檢視對應用透明,增加和刪除物化檢視不會影響應用程式中SQL 語句的正確性和有效性;物化檢視需要佔用儲存空間;當基表發生變化時,物化檢視也應當重新整理。
如如何建立在特定的表空間上,這些在其他的物化檢視上面幾乎都沒有任何介紹的。主要以我做的一個例子來操作,如果對物化檢視的基本概念清楚了就比較明白在那裡寫特定的表空間儲存了。



5、刪除物化檢視日誌物化檢視日誌經常會由於物化檢視長時間沒有重新整理,或者基表的一次批量資料更改而變得很大,這會影響物化檢視的重新整理效能,因此對於這種情況需要對物化檢視日誌進行處理,降低物化檢視日誌表的高水位線。
物化檢視日誌會記錄下基表所有的增、刪、改操作,而物化檢視執行完快速重新整理操作後,會從物化檢視日誌中將本物化檢視重新整理過且其他物化檢視所不需要重新整理的記錄刪除掉。如果其中一個物化檢視一直不重新整理,那麼物化檢視日誌就會變得越來越大。
還有一種情況,比如表中插入了大量的資料,或者刪除了大量的資料,或者將表中的某一列統一更新為一個值,這種操作都會在物化檢視日誌中產生大量的記錄。
而物化檢視日誌的增大必然影響物化檢視的重新整理速度。一方面,物化檢視在重新整理的時候要掃描物化檢視日誌,另一方面,物化檢視在重新整理介紹後,也要清除物化檢視日誌中的記錄,仍然要掃描物化檢視日誌,因此物化檢視日誌的大小直接會影響物化檢視快速重新整理的速度。更重要的是,物化檢視日誌的高水位一旦增長到一個很高的位置,即使以後物化檢視日誌中記錄很少,甚至沒有記錄存在,物化檢視在重新整理的時候仍然需要較長的時間。
SQL> DROP materialized view log on mv_lvy_levytaxbgtp; 
SQL> DROP materialized view log on tb_lvy_levydetaildata; 
SQL> DROP materialized view log on tb_lvy_levydata; 
6、刪除物化檢視SQL> drop materialized view MV_LVY_LEVYDETAILDATA; 
基本和對錶的操作一致,物化檢視由於是物理真實存在的,故可以建立索引,建立方式和對普通表建立方式相同。
三、ORACLE物化檢視總結物化檢視是包括一個查詢結果的資料庫對像,它是遠端資料的的本地副本,或者用來生成基於資料表求和的彙總表。物化檢視儲存基於遠端表的資料,也可以稱為快照。物化檢視可以查詢表,檢視和其它的物化檢視。主要用在資料倉庫和決策支援系統。
通常情況下,物化檢視被稱為主表(在複製期間)或明細表(在資料倉庫中)。對於複製,物化檢視允許你在本地維護遠端資料的副本,這些副本是隻讀的。如果你想修改本地副本,必須用高階複製的功能。當你想從一個表或檢視中抽取資料時,你可以用從物化檢視中抽取。對於資料倉庫,建立的物化檢視通常情況下是聚合檢視,單一表聚合檢視和連線檢視。
物化檢視把他的物理結構儲存在自己的段中,該段可以被索引和分割槽。查詢不必完全匹配用來建立物化檢視的SQL語句,優化程式可以動態重寫一個與原定義相近的查詢,以便物化檢視用來代替實際的表,這種查詢重寫自動發生,對使用者是透明的。
1、使用物化檢視前的幾個配置步驟(1) 確定那些語句要建立物化檢視。
(2) 決定是否要保持檢視與基礎表資料同步。
如果不同步,可選擇如下三種重新整理方式:
COMPLETE:重新整理啟動時,先truncate物化檢視,再從基礎表重新插入填充資料。
FAST:只重新整理基礎表上次重新整理後改變的資料。使用檢視的日誌資料或ROWID完成。
FORCE:預設的方式。先使用FAST,不行就使用COMPLETE方式。
(3) 設定init.ora的引數:
JOB_QUEUE_PROCESSES,必須設定大於 1。
QUERY_REWRITE_ENABLED,設定為TRUE時,允許動態重寫查詢。
QUERY_REWRITE_INTEGRITY,確定訪問物化檢視時資料一致性要遵守的程度。
OPTIMIZER_MODE,必須設定成CBO的某種方式。
使用一個物化檢視,使用者只需在基礎表上擁有許可權即可。
2、建立物化檢視SQL>create materialized view emp_by_district
Tablespace mview_data
Build immediate
Refresh fast
Enable query rewrite
As 
Select d.id,count(e.last_name) from distributor dist,district d,employee e
Where e.id = dist.manager_id
And d.id dist.district_id
Group by d.id;
以下是Oracle建立物化檢視時的常用語法,各引數的含義如下:
1、refresh [fast|complete|force] 檢視重新整理的方式
fast: 增量重新整理.假設前一次重新整理的時間為t1,那麼使用fast模式重新整理物化檢視時,只向檢視中新增t1到當前時間段內,主表變化過的資料.為了記錄這種變化,建立增量重新整理物化檢視還需要一個物化檢視日誌表。create materialized view log on (主表名)。
complete:全部重新整理。相當於重新執行一次建立檢視的查詢語句。
force: 這是預設的資料重新整理方式。當可以使用fast模式時,資料重新整理將採用fast方式;否則使用complete方式。
2、MV資料重新整理的時間
on demand:在使用者需要重新整理的時候重新整理,這裡就要求使用者自己動手去重新整理資料了(也可以使用job定時重新整理)
on commit:當主表中有資料提交的時候,立即重新整理MV中的資料;
start ……:從指定的時間開始,每隔一段時間(由next指定)就重新整理一次;
3、Build immediate一共有三個選項
(1) Build immediate:建立物化檢視,並使用當前命令執行的資料馬上填充檢視資料。
(2) Build deferred:只建立物化檢視,在第一次重新整理之間不填充資料。
(3) No prebuilt table,使用事先已存在的,已含有檢視定義中有現有資料的表,而不是建立一個新結構來儲存資料。
如果是refresh fast on commit或refresh complete on commit建立的,則在基礎表提交的時候都會得到重新整理。啟用或禁用物化檢視,需要有query rewrite或global query rewrite許可權。
3、重新整理物化檢視自動重新整理:
(1) 使用commit選項。
(2) 使用dbms_mview安排自動重新整理時間。
手工重新整理:
SQL>execute dbms_mview.refresh(‘EMP_BY_DISTRICT’); --重新整理指定的物化檢視
SQL>execute dbms_mview.refresh_defresh_dependent(‘EMPLOYEE’); ――重新整理利用了該表的所有物化檢視
SQL>execute dbms_mview.refresh_all_mviews; ――重新整理該模式中,自上次重新整理以來,未得到重新整理的所有物化檢視。
4、禁用物化檢視- 修改init.ora引數的query_rewrite_enabled引數設定成flase,重啟例項。
- 使用alter system set query_rewrite_enabled = flase;動態修改。
- 使用alter session set query_rewrite_enabled = flash;修改會話內。
- 使用 norewrite提示。
5、刪除物化檢視SQL>drop materialized view emp_by_district;

相關推薦

ORACLE物化檢視-可以完全

快速:一、物化檢視的建立create materialized view [view_name] refresh [fast|complete|force] [ on [commit|demand] | start with (start_time) next (next_t

GC學習入門 (基於Oracle JDK 8)

目錄 垃圾收集 (Garbage Collection) 機制是 Java 的一大優勢特性, 為充分榨取 JVM 效能, 避免系統因垃圾收集不及時導致的 OOM (OutOfMemory, 記憶體溢位)問題, 或記憶體飽和出現無法響應使用者請求的情況, 就需要根據伺服器配置及應用複雜度對 GC 策略進行優化

【轉】【修真院“善良”系列之十八】WEB程序員從零開始到就業的全資料V1.0——只

absolute feed 自己 session rem 好的 ans 一個 css樣式 這是兩年以來,修真院收集整理的學習資料順序。以CSS15個任務,JS15個任務為基礎,分別依據要完成任務的不同的技能點,我們整理出來了這麽一篇在學習的時候需要看到的資料。這是Versi

Java中的多線程你只要

== 討論 cin 線程池。 locking nth lis dset tro 引 如果對什麽是線程、什麽是進程仍存有疑惑,請先Google之,因為這兩個概念不在本文的範圍之內。 用多線程只有一個目的,那就是更好的利用cpu的資源,因為所有的多線程代碼都可以用單線程來實現。

Azure IOT 設備固件更新技巧

trigger 物聯網平臺 搭建 href ice 有效 面板 調用 創建 嫌長不看版 今天為大家準備的硬菜是:在 Azure IoT 中心創建 Node.js 控制臺應用,進行端到端模擬固件更新,為基於 Intel Edison 的設備安裝新版固件的流程。通過創建模擬設備

轉:Java中的多線程你只要

無法 線程不安全 str his ace oat 情況下 containe live 如果對什麽是線程、什麽是進程仍存有疑惑,請先Google之,因為這兩個概念不在本文的範圍之內。 用多線程只有一個目的,那就是更好的利用cpu的資源,因為所有的多線程代碼都可以用單線程來實現

想做好PPT折線圖

12月 image 菊花 -c 強調 spa any border 線圖 配圖主題無關今天鄭少跟大家聊聊折線圖的使用方法,或者你有疑問,折線圖很簡單,插入修改數據不就好了嗎?如果你要是這樣想的,恭喜你,有可能你會做出下面這樣的效果。如果你要是稍微懂一點折線圖的使用方法,你就

JSON入門

jsb cart 開發包 fonts 數據 長度 gmv lock 在哪裏 什麽是JSON JSON:JavaScript Object Notation 【JavaScript 對象表示法】 JSON 是存儲和交換文本信息的語法。類似 XML。 JSON采用完全獨立於任何

分布式事務

直接 比較 hub fir demon transacti 遇到 維護 commit 前言 不知道你是否遇到過這樣的情況,去小賣鋪買東西,付了錢,但是店主因為處理了一些其他事,居然忘記你付了錢,又叫你重新付。又或者在網上購物明明已經扣款,但是卻告訴我沒有發生交易。這一系列情

python3 urllib爬蟲你只需要

寫在最前面:以下資料均脫敏 from urllib import request import requests import urllib if __name__ == "__main__": # 介面的url session_requests = requests.se

Java中的多執行緒你只要(轉)

引 如果對什麼是執行緒、什麼是程序仍存有疑惑,請先Google之,因為這兩個概念不在本文的範圍之內。 用多執行緒只有一個目的,那就是更好的利用cpu的資源,因為所有的多執行緒程式碼都可以用單執行緒來實現。說這個話其實只有一半對,因為反應“多角色”的程式程式碼,最起碼每個角色要給他一個執行緒吧,否

易學筆記--Servlet和JSP--入門

第4章:作為Servlet:請求和響應/4.1 Servlet載入過程 第4章:作為Servlet:請求和響應/4.2 請求 第4章:作為Servlet:請求和響應/4.3 響應 第4章:作為Servlet:請求和響應/4.4 資源下載例項 第4章:作為Servlet:

Maven教程--入門

第1章:Maven概述/1.1 Maven的概念 第1章:Maven概述/1.2 Maven的功能 第1章:Maven概述/1.3 與其它構建相比/1.3.1 Make 第1章:Maven概述/1.3 與其它構建相比/1.3.2 Ant 第2章:Maven的安裝/2.1

Linux 問題故障定位

1. 背景 有時候會遇到一些疑難雜症,並且監控外掛並不能一眼立馬發現問題的根源。這時候就需要登入伺服器進一步深入分析問題的根源。那麼分析問題需要有一定的技術經驗積累,並且有些問題涉及到的領域非常廣,才能定位到問題。所以,分析問題和踩坑是非常鍛鍊一個人的成長和提升自我能力。如果我們有一套好的分析工具,那將是事

C語言從入門到精通

影響 內容 當前 位置 replace 雙精度 下標 寄存器變量 一個 No.1 計算機與程序設計語言的關系 計算機系統由硬件系統和軟件系統構成,硬件相當於人類的肉體,而軟件相當於人類的靈魂,如果脫離了靈魂,人類就是一具行屍走肉 No.2 C語言的特點 代碼簡潔,靈活性高

【MYSQL學習筆記02】MySQL的高階應用之Explain(完美詳細版

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/wx1528159409 最近學習MySQL的高階應用Explain,寫一篇學習心得與總結,目錄腦圖如下: 一、Explain基本概念 1. Explain定義 · 我們知道M

學爬蟲利器XPath,

XPath的使用 XPath,全稱 XML Path Language,即 XML 路徑語言,它是一門在XML文件中查詢資訊的語言。XPath 最初設計是用來搜尋XML文件的,但是它同樣適用於 HTML 文件的搜尋。 所以在做爬蟲時,我們完全可以使用 XPath 來做相應的資訊抽取,本節我們

】kubernetes入門命令列操作(例項演示)

寫在前面:網上找了好久終於找到了期盼已久的、一個一眼就能理解的kubernetes“整體全過程”文章。 建議看這篇文章可以結合kubernetes官網(www.kubernetes.io)的Tutorial進行演練,效果很好。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Word中的表格在 Excel中總是變形, 不用怕! !

我們都知道Word和Excel都能製作表格,有的時候在Word中製作好的表格想要插入到Excel中去總是會出現格式錯誤,出現表格變形。這讓我們苦惱了,辛辛苦苦做的表格又要重做了。 那麼我們如何能夠才能讓表格在Word或者Excel不出現格式上的錯誤呢? 1.其實很簡單,我們將wo

selenium使用

使用 seleniun模擬瀏覽器進行資料抓取無疑是當下最通用的資料採集方案,它通吃各種資料載入方式,能夠繞過客戶巧S加密,繞過爬蟲檢測,繞過簽名機制,它的應用,使得許多網站的反採集第略形同虛設:由於lenium不會在HTP請求資料中留下指紋,因此無法被網站直接識別和攔截。但