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值的列上创建非聚集索引,会发生什么情况?