一、定義
視圖是一種虛擬表,一個視圖看起來像是一個表,但實際上它並不存儲任何數據。視圖是從一個或多個表中選擇特定的列構成的。每當從視圖中查詢數據時,查詢語句就會把查詢條件轉化為一個對基本表的查詢,對錶的數據進行過濾,然後返回結果。
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
物化視圖是一個已經計算的表,可以看作是一個數據表的靜態快照。物化視圖會將基表中的數據結果存儲到磁盤上,並在物化視圖上建立索引,這樣查詢物化視圖就像查詢一張普通的表一樣。物化視圖是對數據庫中表的數據的拷貝,和普通表一樣,物化視圖中的數據在物理上實際保存在磁盤上,而不是在計算機的內存中。
CREATE MATERIALIZED VIEW view_name
REFRESH [FAST | COMPLETE | FORCE] [ON DEMAND | ON COMMIT | EVERY interval]
AS SELECT column1, column2, ...
FROM table_name
WHERE condition;
二、性能
視圖只是一個查詢,數據仍然存儲在基本表中,每次查詢都需要重新計算結果集。相對而言,物化視圖就像是一個快照,存儲了一份物化視圖中的查詢結果集,每次查詢都不需要重新計算結果集。
當查詢條件相對簡單、計算量小,選擇使用視圖,速度較快;當查詢數據量大、計算量大,可以先使用物化視圖計算出結果集,然後查詢物化視圖加速查詢。
三、維護
每次查詢視圖時,都需要重新計算結果集,對於較大的數據集,這個計算代價非常大,且隨着數據量的增加,性能將會下降。相對而言,物化視圖在創建後,每次查詢都不需要重新計算結果集,對於定期發生查詢的情況,可以大大提升查詢性能。
然而,由於物化視圖是一份靜態的結果集,所以當基表發生更新時,視圖中的內容並不會自動發生變化,必須手動更新物化視圖。因此,物化視圖的維護成本比較高,需要把控好數據同步的時機,並定期更新物化視圖。
四、壓縮
視圖本身並不會佔用數據庫磁盤空間,也不需要進一步額外的存儲空間管理。而物化視圖生成後會佔用磁盤空間,且隨着數據量以及複雜度的增加,佔用的空間也會相應增加。雖然物化視圖中的數據可以針對某些列進行壓縮,但需要注意壓縮空間和查詢效率之間的平衡問題。
五、更新
視圖是對基表數據的虛擬表,通過視圖查詢的結果是基於基表動態計算得到的,並不需要像物化視圖一樣手動更新。因此,任何對基表的更新操作都會在視圖查詢結果集中反映出來。
物化視圖是一個靜態結果集,和普通的基本表一樣,可以對視圖中的數據進行增、刪、改等操作,但如果不手動更新物化視圖,物化視圖中的數據不會自動發生變化。
六、應用場景
視圖通常用於過濾、組合、轉換數據以及簡化查詢語句等領域,對於小數據集、計算簡單的查詢,使用視圖可以快速得到結果。
物化視圖則適用於:計算耗時的查詢;複雜的數據集計算;以物化視圖結果為基礎的大量聯查;數據倉庫中的數據統計等場景。
七、總結
Oracle物化視圖和視圖都是查詢結果的容器,不過物化視圖存儲靜態查詢結果,而視圖是動態計算得到查詢結果。視圖不需要額外的管理,但無法加快查詢速度,而物化視圖可以加速查詢,但管理和維護成本相對較高。在應用的時候,需要根據實際需求選擇適當的容器。
原創文章,作者:SNNHH,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/371861.html