Postgres表分区不提高查询速度

问题描述 投票:0回答:1

我有一个查询在一个表(TABLE_A)上运行,该表由recTime分区......

WITH subquery AS ( 
select count(*) AS cnt, date_trunc('day',recTime) AS recTime 
from TABLE_A 
WHERE (recTime >= to_timestamp('2018-Nov-03 00:00:00','YYYY-Mon-DD HH24:MI:SS') 
   AND recTime <= to_timestamp('2018-Nov-03 23:59:59','YYYY-Mon-DD HH24:MI:SS')) 
GROUP BY date_trunc('day',recTime) 
) 
UPDATE sumDly 
SET fixes = subquery.cnt 
FROM subquery 
WHERE 
  sumDly.Day = subquery.recTime

如果我对查询进行了如上所示的解释,很明显数据库正在对父表中的每个分区进行索引扫描。相关成本很高,经过的时间很荒谬。

如果我通过替换...明确强制使用实际拥有数据的分区。

 from TABLE_A 

随着...。

from TABLE_A_20181103

然后解释只使用所需的分区,查询只需几分钟(返回的结果与之前相同)

问题 - 为什么数据库要扫描表中的所有分区?我虽然分区的整个想法是帮助数据库在第一次传递中消除大量不需要的数据,而不是强制扫描单个分区中的所有索引?


更新 - 我使用的是postgres 10.5版

postgresql query-performance database-partitioning
1个回答
0
投票

SET constraint_exclusion = on并确保将约束硬编码到查询中。请注意,您确实在查询中对约束进行了硬编码:

...
WHERE (recTime >= to_timestamp('2018-Nov-03 00:00:00','YYYY-Mon-DD HH24:MI:SS') 
   AND recTime <= to_timestamp('2018-Nov-03 23:59:59','YYYY-Mon-DD HH24:MI:SS'))
... 
© www.soinside.com 2019 - 2024. All rights reserved.