我试图分析为什么某个查询需要相当长的时间。它运行在分区的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,所以我认为似乎没问题,但遗憾的是它不是。是否有人知道如何改进此查询以便只扫描相关分区?
谢谢, 老爹
答案 0 :(得分:1)
你正在使用的表达式被Postgres认为不可变(出于同样的原因,now()不是),因此Postgres在优化查找时不会使用它来考虑。抛弃一个额外的where子句,它在过去是不变的,而且足够远。
或者,在分区时不会直接使用时间戳来完全避免这个问题吗?