用通俗易懂的方式聊聊數據庫”物化視圖“
我們來用通俗易懂的方式解釋一下「物化視圖」(Materialized View)。
核心思想:一個“預購”的查詢結果表
你可以把普通視圖想象成餐廳菜單上的菜品圖片。它本身不是菜,而是一個查詢命令。你點菜(查詢視圖)時,廚師(數據庫)才會現場(Real-Time)按照圖片的樣子(視圖的定義)去炒菜(執行SQL查詢)。每次點,每次都要炒。
而物化視圖則是餐廳提前做好的成品菜或預制菜。廚師在特定時間(比如每天早上)或者根據要求,提前把復雜的菜做好,放在保溫柜里。當你點這道菜時,服務員直接從保溫柜里端給你,速度極快!
專業一點說:
物化視圖是一個查詢(SELECT語句)的結果集被持久化存儲下來的一張真實的表。它不是虛擬的,它占用了實際的存儲空間。
一個生動的例子
假設你有一張巨大的銷售記錄表,有上億行數據。高管經常需要看【每日銷售總額】報表。
-
不用物化視圖的寫法:
sqlSELECT sales_date, SUM(sales_amount) FROM huge_sales_table GROUP BY sales_date;每次執行這個查詢,數據庫都要掃描上億行記錄,進行分組、聚合計算。非常慢,而且每次都會消耗大量CPU和I/O資源。
-
使用物化視圖:
你創建一個物化視圖,名叫daily_sales_summary。sqlCREATE MATERIALIZED VIEW daily_sales_summary AS SELECT sales_date, SUM(sales_amount) as total_sales FROM huge_sales_table GROUP BY sales_date;創建時,數據庫會立即執行一次這個查詢,然后將結果(比如365行,代表過去一年的每日銷售額)存儲在一張真實的表里。
之后的高管查詢就變成了:
SELECT * FROM daily_sales_summary;
這個查詢是在直接從一張只有365行的小表里讀數據,速度極快,幾乎是瞬間完成。
物化視圖的核心特點與工作機制
-
它是真實的表:它占用磁盤空間,可以像普通表一樣被查詢,甚至可以給它單獨創建索引來進一步優化。
-
它不是實時更新的:這是它和普通視圖最大的區別。底層表(
huge_sales_table)新增、修改、刪除了數據,物化視圖里的“預制數據”不會立刻改變。這導致了“數據延遲”。 -
需要刷新(Refresh):為了讓物化視圖的數據與底層表保持同步,你需要定期或手動地“刷新”它。
-
刷新方式:
-
全量刷新(Complete Refresh):清空物化視圖,然后重新執行定義它的那個
SELECT語句。簡單但慢,尤其是基礎數據量大時。 -
增量刷新(Fast Refresh):只更新物化視圖中那些因為底層表變化而受影響的數據行。高效但實現復雜,通常需要數據庫的支持(如通過日志記錄變化)。
-
-
-
刷新時機:
-
ON DEMAND(按需刷新):需要手動執行刷新命令(如
EXEC DBMS_MVIEW.REFRESH('daily_sales_summary');)。 -
ON COMMIT(提交刷新):一旦底層表的事務被提交(Commit),數據庫自動刷新物化視圖。這能保證數據強一致性,但對數據庫性能影響較大。
-
定時刷新:數據庫根據你設定的時間表(如每天凌晨2點)自動刷新。
-
物化視圖的優缺點
優點 (為什么要用?)
-
極致提升查詢性能:這是最核心的目的。將復雜的、耗時的計算(如
JOIN,GROUP BY,聚合函數)提前做好,讓最終用戶查詢秒出結果。 -
減少對源表的壓力:將分析查詢的壓力從繁忙的OLTP生產庫(源表)轉移到了物化視圖上,避免大查詢拖垮核心業務。
-
簡化復雜查詢:對應用層和用戶來說,他們只需要查詢一個簡單的視圖,無需關心背后復雜的邏輯。
缺點 (代價是什么?)
-
數據非實時:在兩次刷新之間,物化視圖的數據是“過時”的。不適合對實時性要求極高的場景。
-
占用存儲空間:它存儲了數據的副本,需要額外的磁盤空間。
-
維護開銷:刷新物化視圖本身需要消耗計算資源和時間。全量刷新在大數據量時可能是一個負擔。
-
復雜度:需要設計刷新策略(何時、如何刷新),增加了架構的復雜度。
常見應用場景
-
數據倉庫和BI報表:這是物化視圖的經典應用場景。為預先定義好的報表提供高速查詢能力。
-
匯總和聚合數據:比如前面的例子,計算每日、每周、每月的KPI總和、平均值、計數等。
-
預連接表:將多個需要頻繁關聯的大表提前連接好,生成一張寬表,避免每次查詢都做昂貴的
JOIN操作。 -
數據同步:在某些場景下,可以用于在不同數據庫節點間同步特定查詢的結果集。
總結
物化視圖的本質是“用空間換時間,用延遲換速度”。
它是一種非常強大的數據庫性能優化技術,通過預計算和存儲結果的方式,將昂貴的查詢成本從“每次查詢時”提前到了“一次性的刷新時”,從而為終端用戶提供了閃電般的查詢體驗。

浙公網安備 33010602011771號