Postgres忽略表约束,即使约束不匹配也扫描所有继承的表

时间:2014-08-09 16:21:29

标签: sql performance postgresql partitioning

我有一个Postgres表,从中创建了大约1000个用于分区数据的继承表。

每个继承的表都对名为capture_time

的时间戳列有约束

capture_time>=X and capture_time<Y

X和Y对于每个继承的表是不同的,并形成连续的,非重叠的范围。

因此,当我运行一个指定capture_time between t1 and t2的查询时,我希望Postgres通过查看表约束来了解哪些表(分区)不会包含要查询的数据。但解释输出告诉我Postgres正在扫描所有表(分区)。

如何让Postgres仅扫描相关表格?

1 个答案:

答案 0 :(得分:1)

好的,我找到了。我在current_date子句中使用where - 非常量参数。将current_date更改为文字值,修复它。

  

约束排除仅在查询的WHERE子句包含时才有效   常量。参数化查询将不会被优化,因为   planner无法知道参数值可能选择哪些分区   在运行时。出于同样的原因,“稳定”的功能如   必须避免CURRENT_DATE。