首页 > 解决方案 > Postgresql 查询在逻辑或中包含常量导致全表扫描

问题描述

我有一个包含形式子句的查询CONSTANT OR t.foo=:foo,其中 CONSTANT 是一些表达式,其计算结果为常量布尔值。然后查询作为全表扫描执行,即使列 foo 上有索引并且简单t.foo=:foo会使用该索引。我分析的示例查询具有:foo IS NOT NULL OR t.foo=:foo. 这是一个简单的例子:

CREATE TABLE tst (
id serial,
name VARCHAR NOT NULL,
age INTEGER NOT NULL,
CONSTRAINT PK_ID PRIMARY KEY(ID));

EXPLAIN SELECT * FROM tst WHERE (23 IS NOT NULL OR id=23);
                       QUERY PLAN                       
--------------------------------------------------------
 Seq Scan on tst  (cost=0.00..22.00 rows=1200 width=40)

这有什么原因吗?有没有办法告诉优化器在逻辑上评估/简化查询?

标签: postgresqlquery-optimizationboolean-logic

解决方案


推荐阅读