LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

PostgreSQL 分區表,不是用來優化性能的!

admin
2025年1月15日 8:30 本文熱度 293

PostgreSQL 中的分區查詢性能,并不總會如你所愿。分區剪枝在特定情況下,是無法正常工作的。

示例

查詢執行中的分區剪枝,需要在某些條件下才會起作用。您需要有分區鍵上的索引,并且規劃器必須選擇嵌套循環來連接表。

CREATE TABLE partitioned_table (
  a int,
  b int,
  c int,
  p int
PARTITION BY RANGE (p);

CREATE TABLE p1 PARTITION OF partitioned_table FOR VALUES FROM (0TO (10);
CREATE TABLE p2 PARTITION OF partitioned_table FOR VALUES FROM (10TO (20);

INSERT INTO partitioned_table
  SELECT g.x, g.x, g.x, g.x FROM generate_series (0,19AS g(x);

CREATE INDEX ON partitioned_table(p);

CREATE TABLE other_table (
  p int,
  r int
);

INSERT INTO other_table
  SELECT 1, g.x FROM generate_series(1,100AS g(x);

VACUUM ANALYZE partitioned_table, other_table;
EXPLAIN (settings, analyzecosts offtiming offsummary off)
SELECT a, b, c
FROM partitioned_table
WHERE p IN (SELECT p FROM other_table WHERE r between 1 and 100);

                                       QUERY PLAN
-----------------------------------------------------------------------------------------
 Nested Loop (actual rows=1 loops=1)
   ->  HashAggregate (actual rows=1 loops=1)
         Group Key: other_table.p
         Batches: 1  Memory Usage24kB
         ->  Seq Scan on other_table (actual rows=100 loops=1)
               Filter: ((r >= 1AND (r <= 100))
   ->  Append (actual rows=1 loops=1)
         ->  Index Scan using p1_p_idx on p1 partitioned_table_1 (actual rows=1 loops=1)
               Index Cond: (p = other_table.p)
         ->  Index Scan using p2_p_idx on p2 partitioned_table_2 (never executed)
               Index Cond: (p = other_table.p)
(11 rows)

請注意,在分區 p2 上的索引掃描是不會執行的。

優化對分區表的訪問

大多數時候,開發者會抱有不切實際的期望,即如果他們對一個巨大的表進行分區,“對其進行查詢會更快”。而實際情況下,分區的目標和目的是方便維護,而不是查詢優化,如果短查詢的執行速度和分區前一樣,他們應該認為是成功的。這是沒有規則沒有例外的,雖然也有性能提升的情況,但那些確實是例外。

為了在分區后使查詢不變慢,開發者需要顯式地包含用于范圍分區的屬性值。很多時候,這個要求并不明顯,而且,它需要對正在使用的 SQL 語句進行重大改寫。

從一個應用開發者的角度來看,他們會這樣做:

SELECT a, b, c
FROM partitioned_table
WHERE p IN (SELECT p FROM other_table WHERE r between 1 and 100)

開發者可能會想當然地認為:我已經在查詢訪問特定的分區了!實際上,在執行開始之前,PostgreSQL 無法知道要查詢的將會是哪個分區!

那么,到底應該怎么做,才能讓 PostgreSQL 確切地知道要查詢哪個分區呢?一個肯定不壞的方法是,先計算出分區鍵的值,然后在查詢中使用它。


閱讀原文:原文鏈接


該文章在 2025/1/15 10:16:13 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
精品国产门事件在线观看 | 中文字幕在线第一页 | 亚洲国产午夜理论片大全 | 日本亚洲欧洲免费无线码 | 亚洲一区中文字幕制服丝袜 | 日本亚洲欧美综合在线无毒 |