postgres:连接分区表

时间:2015-02-20 10:01:34

标签: database postgresql optimization partitioning postgresql-performance

我想加入一个巨大的分区表。规划人员可能认为分区表的扫描非常便宜。

我有以下查询:

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.tsclicks.userid

我在users.ageuser.idclicks.useridclicks.ts

上有索引

也许我必须相信计划者。我只是有点不安全,因为我曾经有过一个案例,其中postgres显示了一些带限制的奇怪行为(PostgreSQL query very slow with limit 1)。

0 个答案:

没有答案