Oracle物化視圖詳解

来源:https://www.cnblogs.com/rangle/archive/2018/02/28/8485235.html
-Advertisement-
Play Games

現實工作中會有多個數據源同步到一個資料庫完成數據分析的場景,這些數據可以不是實時同步的,我們一般通過定時任務抽取數據到統計分析庫給應用使用。 一般的同步方式可以通過時間戳做全量和增量數據同步(存在原數據變化可能,數據不一致的情況),也可以通過dblink做數據實時查詢(較損耗線上資料庫性能),一般最 ...


現實工作中會有多個數據源同步到一個資料庫完成數據分析的場景,這些數據可以不是實時同步的,我們一般通過定時任務抽取數據到統計分析庫給應用使用。

一般的同步方式可以通過時間戳做全量和增量數據同步(存在原數據變化可能,數據不一致的情況),也可以通過dblink做數據實時查詢(較損耗線上資料庫性能),一般最好的方式是通過建立物化視圖,然後通過schedual job完成定時數據同步,這裡就記錄下物化視圖的使用。

一、物化視圖簡介

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

1、物化視圖分類

ON DEMAND:該物化視圖“需要”被刷新了,才進行刷新(REFRESH),即更新物化視圖,以保證和基表數據的一致性;

ON COMMIT:一旦基表有了COMMIT,即事務提交,則立刻刷新,立刻更新物化視圖,使得數據和基表一致

預設情況創建物化視圖不指定類型,則是按需刷新(on demand)

2、物化視圖

 

二、物化視圖使用

1、物化視圖創建

物化視圖的數據來源於基表,而刷新的起始點記錄於物化視圖日誌,所以創建物化視圖授權必須有基表——>物化視圖日誌(基於基表)——>物化視圖

物化視圖創建示例:

在dbtest下創建物化視圖T,其中基表是scott用戶下的dept表
(1)授權dbtest用戶可以查詢scott.dept
grant select on scott.dept to dbtest;
(2)在dbtest用戶下創建表T (若創建物化視圖加on prebuilt table) 
create table t as select * from scott.dept where 1=2;
3)在scott用戶下創建物化視圖日誌,在dbtest下創建物化視圖T
創建物化視圖日誌:
conn scott
/tiger;
create materialized view log on dept;
grant select on MLOG$_DEPT to dbtest;
創建物化視圖:
conn dbtest
/dbtest;
create materialized view T
on prebuilt table
refresh fast
on demand as select deptno,dname,loc,ACOLUMN from scott.dept;

##可以通過在 view T後加上BUILD IMMEDIATE參數立刻刷新物化視圖,得到數據

REFRESH 子句可以包含如下部分:
   [refresh [fast|complete|force]
   [on demand | commit]
   [start with date] [next date]
   [with {primary key|rowid}]]

2、物化視圖刷新

當基表有更新後(DML),如果不是on commit類型,物化視圖需要刷新後數據才能保持和基表一致,刷新方式有全量刷新(COMPLETE)、快速刷新(增量FAST)、強制刷新(FORCE)、不刷新(NEVER)

FAST:增量快速刷新

exec dbms_mview.refresh('表名', 'F')  

exec dbms_mview.refresh('dbtest.t','F');

COMPLETE:全量刷新

exec dbms_mview.refresh('表名', 'C')   ;

exec dbms_mview.refresh('dbtest.t','C');

FORCE:刷新時判斷否可以快速刷新,如果能快速刷新則執行fast刷新,如果不能則執行complete刷新

NEVER:不刷新

3、物化視圖刪除

drop MATERIALIZED VIEW  mview_name;

4、物化視圖日誌刪除

物化視圖日誌是mlog$_basetablename命名格式

DROP MATERIALIZED VIEW LOG  on base_table_name;
MLOG$_DEPT 

 DEPTNO           主鍵列
 SNAPTIME$$       用於表示刷新時間
 DMLTYPE$$        用於表示dml操作類型,i表示insert,d表示delete,u表示update
 OLD_NEW$$        用於表示這個值是新值還是舊值。n(ew)表示新值(一般為delete操作),o(ld)表示舊值(一般為Insert操作),u表示update操作。
 CHANGE_VECTOR$$  表示修改矢量,用來表示被修改的是哪個或哪幾個欄位
 XID$$              

如果with後面跟了primary key,則物化視圖日誌中會包含主鍵列。
如果with後面跟了rowid,則物化視圖日誌中會包含: m_row$$:用來存儲發生變化的記錄的rowid。
如果with後面跟了object id,則物化視圖日誌中會包含:sys_nc_oid$:用來記錄每個變化對象的對象id。
如果with後面跟了sequence,則物化視圖日子中會包含:sequence$$:給每個操作一個sequence號,從而保證刷新時按照順序進行刷新。
如果with後面跟了一個或多個column名稱,則物化視圖日誌中會包含這些列。  

當基本表發生dml操作時,會記錄到物化視圖日誌中,這時指定的時間4000年1月1日0時0分0秒(物化視圖未被刷新)。
如果物化視圖日誌供多個物化視圖使用,則一個物化視圖刷新後會將它刷新的記錄的時間更新為它刷新的時間。
只有建立快速刷新的物化視圖才能使用物化視圖日誌,如果只建立一個物化視圖,則物化視圖刷新完會將物化視圖日誌清除掉

--當創建物化視圖日誌使用primary key時,oracle創建臨時表 RUPD$_基礎表

5、查看物化視圖

set line 200;
set pagesize 20000;
col owner for a15;
col mview_name for a30;
col query for a60;

select owner,mview_name,refresh_method,last_refresh_date,compile_state from dba_mviews;

#如果要看具體語句,可以通過query欄位查看

 

三、附錄

 

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近看自旋鎖的實現,自選鎖的迴圈查找鎖的主要實現類似如下,該實現使用到了內嵌的彙編(摘自sanos內核,源代碼有2處實現,一處使用intel彙編,是沒有問題的,另一處使用內嵌彙編語法,源代碼中為cmpxchgl %2, %0,是錯誤的,應該是cmpxchgl %0, %2) 內嵌彙編有個固定格式,如 ...
  • firewall-cmd:防火牆設置的命令行工具。 語法:firewall-cmd [OPTIONS...] 常見選項: -h:列印幫助信息; -V:列印版本信息; -q:退出,不用列印狀態信息。 狀態選項: --state:檢查防火牆進程是否激活有效。如果有效,返回0值;否則返回非0值。 --re ...
  • 如何在CentOS 7上部署Google BBR 本文章搬運自 https://www.vultr.com/docs/how-to-deploy-google-bbr-on-centos-7 【註:文章當時使用的內核版本是4.9.0 而目前是4.15.6(4.15版本高於4.9)】 步驟 1: 使用 ...
  • 錯誤1. ERROR: child process failed, exited with error number 100 可能原因: 1.沒有正確關閉服務 2.服務已經啟動 3.conf文件的參數配置錯誤。 錯誤2. "errmsg" : "not authorized on admin to ...
  • 一、概述 MongoDB複製群集支持節點故障自動切換,最小配置應包含3個節點,正常情況下應該至少包含兩個數據節點,第三個節點可以是數據節點也可以是仲裁節點。仲裁節點的作用是當出現偶數節點導致無法仲裁的時候參與進來進行投票使之變成奇數個投票點,仲裁節點可以看成是不包含任何數據集的副本節點。仲裁節點並不 ...
  • 來源地址:https://baike.baidu.com/item/NoSQL/8828247?fr=aladdin NoSQL,泛指非關係型的資料庫。隨著互聯網web2.0網站的興起,傳統的關係資料庫在應付web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心 ...
  • Window XP系統上安裝Oracle Database 10G,在Mac系統上使用Navicat遠程連接oracle資料庫(不需要安裝oracle客戶端,Navicat 11 已經集成了該客戶端) ...
  • 最近同事在交接工作時,發現有幾個schedule job沒有執行成功,我這邊給看了下,其中一個是由於資料庫遷移,調用dblink的host主機IP在tnsnames中沒有變更導致,還有一個是無法視圖的報錯,即報錯信息如下: 一、錯誤日誌 通過查看schedual job報錯日誌,具體報錯信息如下 O ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...