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

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

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

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

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

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

從一個(gè)應(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ū)了!實(shí)際上,在執(zhí)行開始之前,PostgreSQL 無法知道要查詢的將會是哪個(gè)分區(qū)!

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


閱讀原文:原文鏈接


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