SQL查询运行速度低于预期

时间:2017-04-21 07:24:23

标签: sql postgresql query-planner

我有一张桌子

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

a1是主键。 a5上有一个非聚类索引。

我有一个简单的查询:

SELECT * 
FROM foo
WHERE a5/100 = 20;

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

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

2 个答案:

答案 0 :(得分:0)

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

这就是不考虑基数的可能问题,即数据分布 - 如果你的WHERE comditions返回超过行的40%左右,则索引变得无用。

修改

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

答案 1 :(得分:0)

您可以在表达式而不是基础数据上创建索引。如果你知道你总是将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

的文档