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

Posted

技术标签:

【中文标题】Postgres 忽略表约束,即使约束不匹配也会扫描所有继承的表【英文标题】:Postgres ignores table constraints, scans all inherited tables even if constraints don't match 【发布时间】:2014-08-09 16:21:28 【问题描述】:

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

每个继承的表都有一个名为 capture_time时间戳列的约束

capture_time>=X and capture_time<Y

每个继承表的 X 和 Y 都不同,并形成连续、不重叠的范围。

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

如何让 Postgres 只扫描相关表?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于Postgres 忽略表约束,即使约束不匹配也会扫描所有继承的表的主要内容,如果未能解决你的问题,请参考以下文章

错误:引用表“bar”的给定键没有唯一约束匹配

Postgres 测试容器 - 如果存在级联,为啥要在删除表之前删除约束?

即使有约束,UIButton 图像也会自动调整大小

即使参数具有非空约束,也会收到有关可空类型参数的错误

为啥当我在 uiscrollview 顶部添加对象时,即使我将所有四个约束都设置为 0,对象也会下降一点?

添加唯一约束但忽略现有表数据