在 PostgreSQL 資料庫中,View 和 Materialized 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 數位科技週報》