淺談 PostgreSQL 資料庫中的 View 及 Materialized View

Posted by Andylinee on Saturday, August 19, 2023

在 PostgreSQL 資料庫中,ViewMaterialized View 是非常有用的工具,它們能夠幫助開發者更加靈活地處理資料並優化查詢效能。現在讓我們透過一些具體的 SQL 語法案例,了解如何在 PostgreSQL 中使用這兩種資料庫檢視表。

View

在 PostgreSQL 中,View 是透過 SELECT 語句定義的虛擬表。它本身不儲存任何資料,而是作為保存的查詢,可以像正常的表一樣引用它。每次查詢 view 時,都會執行底層的 SELECT 語句,並且結果會以表格呈現。

View 在簡化複雜查詢、封裝業務邏輯和為資料提供更友善的界面有很大的好處。然而,View 也可能會對性能造成影響,尤其是對於複雜查詢或大型資料集,因為每次使用 view 時都會執行查詢。

假設我們有一張資料表 employees,包含了員工的資料,包括姓名、部門、職位和薪水。現在我們想要創建一個 view,只顯示部門為 Sales 的員工資料:

-- 創建名稱為 sales_employees 的 view

CREATE VIEW sales_employees AS
SELECT * FROM employees
WHERE department = 'Sales';

現在,我們可以透過以下方式查詢 sales_employees view,來獲取所有部門為 Sales 的員工資料:

SELECT * FROM sales_employees;

Materialized View

在 PostgreSQL 中,Materialized View 和一般的 View 類似,但 Materialized View 還將底層 SELECT 語句的結果集作為實際資料儲存在硬碟上。這代表只有在創建或更新 Materialized View 時才會執行查詢,並且因為資料被儲存起來,會讓後續的查詢速度更快。

Materialized View 適用於需要預先計算和儲存複雜查詢結果以提高查詢性能的情況。雖然擁有儲存資料的優勢,但在重新更新 Materialized View 之前可能會保存了過時的資料。

現在,假設我們有一張資料表 order_items,儲存了每個訂單的商品資訊,包括產品編號、訂單日期和銷售量。我們希望創建一個 Materialized View,計算每個產品的月度銷售總量,以提高查詢效能:

-- 創建名稱為 monthly_product_sales 的 Materialized View

CREATE MATERIALIZED VIEW monthly_product_sales AS
SELECT product_id, 
       DATE_TRUNC('month', order_date) AS sales_month,
       SUM(quantity) AS total_sales
FROM order_items
GROUP BY product_id, sales_month

現在,我們可以透過以下方式查詢 monthly_product_sales 這個 Materialized View,來獲取每個產品的月度銷售總量:

SELECT * FROM monthly_product_sales;

View vs. Materialized View

現在,讓我們通過以下表格比較一下這兩種數據庫對象的區別和使用時機:

特性 View Materialized View
數據儲存 不儲存實際資料 儲存實際查詢結果
效能 執行時計算查詢 儲存計算後的查詢結果
查詢速度 受底層查詢性能影響 快速查詢
資料更新 不適用於資料更新 可透過 refresh 來更新資料
適用場景 簡化查詢、封裝邏輯 提高查詢性能

整體而言,在 PostgreSQL 中,View 和 Materialized View 都是優化查詢和提高資料處理彈性的有效工具。View 適用於簡化複雜查詢和封裝業務邏輯,而 Materialized View 適用於需要提高查詢性能並預先計算複雜查詢結果的情況。根據實際需求和性能要求,選擇適合的資料庫對象將有助於優化資料庫操作。


《DTW 數位科技週報》

如果想要每週獲得最新的數位科技、區塊鏈及人工智慧新聞整理,歡迎訂閱免費電子報:《DTW 數位科技週報》