PostgreSQL:仅扫描相关分区

时间:2013-10-18 10:05:42

标签: sql postgresql

我试图分析为什么某个查询需要相当长的时间。它运行在分区的PostgreSQL(v9.1)表上。它每月分区。该规则基于一个包含日期的整数表示的列(所以在示例20130801中)。

如果我写这样的查询:

EXPLAIN     SELECT DISTINCT (user_id)
FROM users
WHERE
    date_tk >= 20130801

仅选择相关分区。但是,当我运行这样的东西时,它会扫描所有分区:

EXPLAIN     SELECT DISTINCT (user_id)
FROM users 
WHERE
    date_tk >= TO_CHAR(CURRENT_DATE - '30 days'::INTERVAL, 'yyyyMMdd')::INT

现在我将约束日期转换为int,所以我认为似乎没问题,但遗憾的是它不是。是否有人知道如何改进此查询以便只扫描相关分区?

谢谢, 老爹

1 个答案:

答案 0 :(得分:1)

你正在使用的表达式被Postgres认为不可变(出于同样的原因,now()不是),因此Postgres在优化查找时不会使用它来考虑。抛弃一个额外的where子句,它在过去是不变的,而且足够远。

或者,在分区时不会直接使用时间戳来完全避免这个问题吗?