我有一个查询,该查询在由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版本
答案 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'))
...