• 全部
  • 經驗案例
  • 典型配置
  • 技術公告
  • FAQ
  • 漏洞說明
  • 全部
  • 全部
  • 大數據引擎
  • 知了引擎
產品線
搜索
取消
案例類型
發布者
是否解決
是否官方
時間
搜索引擎
匹配模式
高級搜索

【MVS】PG 聚簇物化視圖 && 普通物化視圖

2025-04-02 發表
  • 0關注
  • 0收藏 343瀏覽
粉絲:2人 關注:5人

問題描述

PG 中 聚簇物化視圖 && 普通物化視圖 創建有何區別

過程分析

創建過程比較,性能測試分析;

解決方法

聚簇物化視圖的作用與意義

聚簇物化視圖(Clustered Materialized View)是PostgreSQL中一種特殊的物化視圖,它在存儲數據時按照指定的聚簇索引進行物理排序。這種設計具有以下優勢:

• 查詢性能提升:數據按照查詢模式物理排序,減少I/O操作

• 預計算優勢:預先計算並存儲複雜查詢結果

• 數據本地性:相關數據物理上相鄰存儲,提高緩存命中率

• 減少計算開銷:避免重複執行相同查詢

創建測試表並初始化數據

-- 創建測試表

CREATE TABLE sales (

    id SERIAL PRIMARY KEY,

    product_id INT,

    sale_date DATE,

    amount DECIMAL(10,2),

    region VARCHAR(50)

);

 

-- 插入測試數據(100萬條)

INSERT INTO sales (product_id, sale_date, amount, region)

SELECT 

    (random()*100)::INT,

    CURRENT_DATE - (random()*365)::INT,

    (random()*1000)::DECIMAL(10,2),

    CASE (random()*5)::INT

        WHEN 0 THEN 'North'

        WHEN 1 THEN 'South'

        WHEN 2 THEN 'East'

        WHEN 3 THEN 'West'

        ELSE 'Central'

    END

FROM generate_series(1, 1000000);

創建普通物化視圖 vs 聚簇物化視圖

-- 創建普通物化視圖

CREATE MATERIALIZED VIEW mv_sales_region AS

SELECT region, SUM(amount) as total_sales, COUNT(*) as transactions

FROM sales

GROUP BY region;

 

-- 創建聚簇物化視圖(沒有直接的CLUSTERED關鍵字,需要兩步)

CREATE MATERIALIZED VIEW mv_clustered_sales_region AS

SELECT region, SUM(amount) as total_sales, COUNT(*) as transactions

FROM sales

GROUP BY region;

 

-- 為聚簇物化視圖創建聚簇索引

CREATE INDEX idx_mv_clustered_region ON mv_clustered_sales_region(region);

 

-- 指定聚簇操作所依據的索引名。

CLUSTER mv_clustered_sales_region USING idx_mv_clustered_region;

 

備注: 1。指定聚簇操作所依據的索引名。執行過以後,係統就會自動記下該表是依據哪個索引進行聚簇排序的,後麵再次執行聚簇操作時係統會自動使用該索引,所以索引名僅在首次聚簇操作時需要,後續不再需要。 2. 每次刷新過物化視圖後,都需要重新對其進行一次聚簇排序操作。

性能對比測試

-- 測試普通物化視圖查詢

test=# EXPLAIN ANALYZE SELECT * FROM mv_sales_region WHERE region = 'North';

                                                 QUERY PLAN

------------------------------------------------------------------------------------------------------------

 Seq Scan on mv_sales_region  (cost=0.00..15.38 rows=2 width=158) (actual time=0.024..0.028 rows=1 loops=1)

   Filter: ((region)::text = 'North'::text)

   Rows Removed by Filter: 4

 Planning Time: 0.186 ms

 Execution Time: 0.063 ms

(5 rows)

 

Time: 1.607 ms

 

-- 測試聚簇物化視圖查詢

test=# EXPLAIN ANALYZE SELECT * FROM mv_clustered_sales_region WHERE region = 'North';

                                                     QUERY PLAN

---------------------------------------------------------------------------------------------------------------------

 Seq Scan on mv_clustered_sales_region  (cost=0.00..1.06 rows=1 width=158) (actual time=0.025..0.028 rows=1 loops=1)

   Filter: ((region)::text = 'North'::text)

   Rows Removed by Filter: 4

 Planning Time: 0.425 ms

 Execution Time: 0.065 ms

(5 rows)

 

Time: 1.414 ms

 

** 實驗分析: **

1. 聚簇物化視圖的查詢計劃會顯示更少的I/O操作

2. 聚簇版本通常會顯示更低的執行時間

3. 對於範圍查詢,聚簇版本的優勢會更加明顯

物化視圖刷新時間對比

更新開銷:聚簇物化視圖的刷新操作需要額外時間進行重新聚簇

-- 刷新普通物化視圖

 

test=# EXPLAIN ANALYZE REFRESH MATERIALIZED VIEW mv_sales_region;

                QUERY PLAN

-------------------------------------------

 Utility statements have no plan structure

(1 row)

 

Time: 0.577 ms

 

-- 刷新聚簇物化視圖(需要先刪除聚簇屬性)

test=# ALTER MATERIALIZED VIEW mv_clustered_sales_region SET WITHOUT CLUSTER;

ALTER MATERIALIZED VIEW

Time: 2.670 ms

test=# EXPLAIN ANALYZE REFRESH MATERIALIZED VIEW mv_clustered_sales_region;

                QUERY PLAN

-------------------------------------------

 Utility statements have no plan structure

(1 row)

 

Time: 0.535 ms

 

-- 刷新後重新聚簇

test=# CLUSTER mv_clustered_sales_region USING idx_mv_clustered_region;

CLUSTER

Time: 10.694 ms

 

最佳實踐建議

1. 為頻繁查詢且模式固定的報表類應用使用聚簇物化視圖

2. 選擇高選擇性的列作為聚簇鍵

3. 在低峰期進行物化視圖刷新

4. 對於頻繁更新的場景,評估聚簇帶來的維護開銷

該案例對您是否有幫助:

您的評價:1

若您有關於案例的建議,請反饋:

0 個評論

該案例暫時沒有網友評論

編輯評論

舉報

×

侵犯我的權益 >
對根叔知了社區有害的內容 >
辱罵、歧視、挑釁等(不友善)

侵犯我的權益

×

泄露了我的隱私 >
侵犯了我企業的權益 >
抄襲了我的內容 >
誹謗我 >
辱罵、歧視、挑釁等(不友善)
騷擾我

泄露了我的隱私

×

您好,當您發現根叔知了上有泄漏您隱私的內容時,您可以向根叔知了進行舉報。 請您把以下內容通過郵件發送到pub.zhiliao@h3c.com 郵箱,我們會盡快處理。
  • 1. 您認為哪些內容泄露了您的隱私?(請在郵件中列出您舉報的內容、鏈接地址,並給出簡短的說明)
  • 2. 您是誰?(身份證明材料,可以是身份證或護照等證件)

侵犯了我企業的權益

×

您好,當您發現根叔知了上有關於您企業的造謠與誹謗、商業侵權等內容時,您可以向根叔知了進行舉報。 請您把以下內容通過郵件發送到 pub.zhiliao@h3c.com 郵箱,我們會在審核後盡快給您答複。
  • 1. 您舉報的內容是什麼?(請在郵件中列出您舉報的內容和鏈接地址)
  • 2. 您是誰?(身份證明材料,可以是身份證或護照等證件)
  • 3. 是哪家企業?(營業執照,單位登記證明等證件)
  • 4. 您與該企業的關係是?(您是企業法人或被授權人,需提供企業委托授權書)
我們認為知名企業應該坦然接受公眾討論,對於答案中不準確的部分,我們歡迎您以正式或非正式身份在根叔知了上進行澄清。

抄襲了我的內容

×

原文鏈接或出處

誹謗我

×

您好,當您發現根叔知了上有誹謗您的內容時,您可以向根叔知了進行舉報。 請您把以下內容通過郵件發送到pub.zhiliao@h3c.com 郵箱,我們會盡快處理。
  • 1. 您舉報的內容以及侵犯了您什麼權益?(請在郵件中列出您舉報的內容、鏈接地址,並給出簡短的說明)
  • 2. 您是誰?(身份證明材料,可以是身份證或護照等證件)
我們認為知名企業應該坦然接受公眾討論,對於答案中不準確的部分,我們歡迎您以正式或非正式身份在根叔知了上進行澄清。

對根叔知了社區有害的內容

×

垃圾廣告信息
色情、暴力、血腥等違反法律法規的內容
政治敏感
不規範轉載 >
辱罵、歧視、挑釁等(不友善)
騷擾我
誘導投票

不規範轉載

×

舉報說明

提出建議

    +

親~登錄後才可以操作哦!

確定

親~檢測到您登陸的賬號未在http://hclhub.h3c.com進行注冊

注冊後可訪問此模塊

跳轉hclhub

你的郵箱還未認證,請認證郵箱或綁定手機後進行當前操作