小编Mar*_*loJ的帖子

Postgres:查询规划器在查询空值时不尊重表继承约束

我遇到了慢查询问题,这是由计划程序检查每个继承的表而不是仅具有约束的表引起的。

我有一个名为“search_result”的 0 行表。该表有几个继承的表,它们具有基于“极化”的不同约束,我们所有的数据都驻留在该表中。例如:

CREATE TABLE search_result_positive
(
  CONSTRAINT search_result_positive_polarization_check CHECK (polarization = (1))
)
INHERITS (search_result);

CREATE TABLE search_result_negative
(
  CONSTRAINT search_result_negative_polarization_check CHECK (polarization = (-1))
)
INHERITS (search_result);

CREATE TABLE search_result_unpolarized
(
  CONSTRAINT search_result_unpolarized_polarization_check CHECK (polarization IS NULL)
)
INHERITS (search_result);
Run Code Online (Sandbox Code Playgroud)

例如,当我使用“WHEREpolarization = 1”执行查询时,查询规划器将显示它只检查了“search_result_positive”:表,这是所需的行为。

但是,当查询是“WHEREpolarization IS NULL”时,它会检查每个表,花费大量时间。以下是“search_result_positive”的示例:

SELECT  "search_result".* FROM "search_result"  WHERE (polarization = 1)  ORDER BY published_on DESC LIMIT 20;

Limit  (cost=0.44..17.65 rows=20 width=2027) (actual time=3.638..3.666 rows=20 loops=1)
  ->  Merge Append  (cost=0.44..249453.67 rows=289872 width=2027) (actual time=3.637..3.663 rows=20 …
Run Code Online (Sandbox Code Playgroud)

postgresql optimization execution-plan postgresql-9.3

7
推荐指数
1
解决办法
118
查看次数