2

我试图分析为什么某个查询需要相当长的时间。它在分区的 PostgreSQL (v9.1) 表上运行。它是每月分区的。该规则基于包含日期整数表示的 a 列(因此在示例 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,所以我认为它似乎没问题,但不幸的是它不是。有人知道如何改进此查询以便仅扫描相关分区吗?

谢谢,老爹

4

1 回答 1

1

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

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

于 2013-10-18T10:57:42.470 回答