我想加入一个巨大的分区表。规划人员可能认为分区表的扫描非常便宜。
我有以下查询:
select *
from (
select users where age < 18 limit 10
) as users
join
clicks on users.id = clicks.userid
where
clicks.ts between '2015-01-01' and now();
表clicks
是主表,大约有40个子表,包含大约4千万条记录。
此查询执行速度非常慢。当我查看规划器postgres时,首先执行clicks
表的完整扫描,然后扫描用户表。
但是,当我将users
子查询限制为1时,计划程序会首先扫描用户,然后扫描点击次数。
好像计划程序假设clicks
表非常轻量级。如果我查看pg_class
中的统计信息,主表clicks
有0个元组。一方面这是真的,因为它是一个主表,但另一方面,对于规划器,它应该包含所有子表的总和。
如何强制规划人员首先使用最便宜的选项?
编辑:在简化查询时,我确实错过了日期的额外约束。
分区限制已启用:clicks.ts
和clicks.userid
我在users.age
,user.id
,clicks.userid
和clicks.ts
也许我必须相信计划者。我只是有点不安全,因为我曾经有过一个案例,其中postgres显示了一些带限制的奇怪行为(PostgreSQL query very slow with limit 1)。