sql 查询运行速度低于预期

sql query runs slower than expected

我有一个table

foo(a1, a2, a3, a4, a5)

a1 是主键。 a5.

上有一个非聚集索引

我有一个简单的查询:

SELECT * 
FROM foo
WHERE a5/100 = 20;

此查询运行速度明显变慢。更新查询计划中使用的统计信息并没有多大帮助。

为什么会这样? 我做错了什么? 我是查询优化的新手。

您正在 WHERE 谓词中的列上使用表达式,因此它不可搜索(不能使用索引)。

这忽略了可能存在的基数问题,即数据分布 - 如果您的 WHERE 条件 return 超过行的 40% 左右,索引将变得无用。

编辑

在索引中搜索一个值,如果该值是表达式的结果,则索引不能是 used.Also 运算符,例如:NOT、NOT IN、<> 也不可搜索,因为对于索引搜索您需要一个明确的值,以便优化器可以定义某种固定范围。随着您的动态计算,值不断变化,因此您需要扫描整个 table.

您可以在表达式而不是基础数据上创建索引。如果你知道你总是要将 a5 除以 100,你可以做一个索引:

CREATE INDEX ON foo ((a5/100));

需要额外的括号。

这样,任何具有 WHERE a5/100 = <something> 的查询都可以利用索引。

虽然WHERE a5/99 = <something>

没有帮助

文档位于 https://www.postgresql.org/docs/current/static/indexes-expressional.html