超碰人人人人人,亚洲AV午夜福利精品一区二区,亚洲欧美综合区丁香五月1区,日韩欧美亚洲系列

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

PostgreSQL 分區(qū)表,不是用來優(yōu)化性能的!

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

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

示例

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

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)

請注意,在分區(qū) p2 上的索引掃描是不會執(zhí)行的。

優(yōu)化對分區(qū)表的訪問

大多數(shù)時候,開發(fā)者會抱有不切實際的期望,即如果他們對一個巨大的表進(jìn)行分區(qū),“對其進(jìn)行查詢會更快”。而實際情況下,分區(qū)的目標(biāo)和目的是方便維護(hù),而不是查詢優(yōu)化,如果短查詢的執(zhí)行速度和分區(qū)前一樣,他們應(yīng)該認(rèn)為是成功的。這是沒有規(guī)則沒有例外的,雖然也有性能提升的情況,但那些確實是例外。

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

從一個應(yīng)用開發(fā)者的角度來看,他們會這樣做:

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

開發(fā)者可能會想當(dāng)然地認(rèn)為:我已經(jīng)在查詢訪問特定的分區(qū)了!實際上,在執(zhí)行開始之前,PostgreSQL 無法知道要查詢的將會是哪個分區(qū)!

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


閱讀原文:原文鏈接


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