sql查询的运行速度比预期的慢

sql查询的运行速度比预期的慢,sql,postgresql,query-planner,Sql,Postgresql,Query Planner,我有一张桌子 foo(a1, a2, a3, a4, a5) a1是主键。 a5上有一个非聚类索引 我有一个简单的问题: SELECT * FROM foo WHERE a5/100 = 20; 此查询的运行速度明显较慢。更新查询规划中使用的统计信息没有多大帮助 为什么会发生这种情况? 我可能做错了什么? 我是查询优化新手 您正在WHERE谓词中的列上使用表达式,因此它不可搜索(不能使用索引) 这就撇开了基数的可能问题,即数据分布——如果WHERE条件返回的行数超过了行数的40%左右,则索

我有一张桌子

foo(a1, a2, a3, a4, a5)
a1
是主键。
a5
上有一个非聚类索引

我有一个简单的问题:

SELECT * 
FROM foo
WHERE a5/100 = 20;
此查询的运行速度明显较慢。更新查询规划中使用的统计信息没有多大帮助

为什么会发生这种情况? 我可能做错了什么?
我是查询优化新手

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

这就撇开了基数的可能问题,即数据分布——如果WHERE条件返回的行数超过了行数的40%左右,则索引将变得无用

编辑


在索引中搜索一个值,如果该值是表达式的结果,则不能使用该索引。此外,诸如:NOT、NOT In等运算符也不可搜索,因为对于索引搜索,您需要一个明确的值,以便优化器可以定义某种固定范围。在计算过程中,值会不断变化,因此需要扫描整个表。

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

CREATE INDEX ON foo ((a5/100));
需要额外的支架

这样,任何具有
其中a5/100=
的查询都可以利用索引

但是,对于
中的a5/99=
等,它没有帮助


文档的速度比什么慢?请提供执行计划。
其中a5/100=20-->尝试
,其中a5=2000并确保在
a5
列上创建了索引。请回答您的问题并添加使用
explain(analyze,verbose)
生成的执行计划。谢谢你的回复。请你详细说明一下好吗。这似乎相当简洁。不完全正确的是,
不在
中不能使用索引。用
定义的部分索引,其中
可能适用于这种情况我还有一个额外的后续问题:如果在缺少/null值的列上创建非聚集索引,会发生什么情况?