Postgres表分区无法提高查询速度

时间:2018-11-04 13:53:52

标签: postgresql query-performance database-partitioning

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

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版本

1 个答案:

答案 0 :(得分: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'))
...