我有一个查询在一个表(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版
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'))
...