如何解决查询优化的 SQL 技巧
根据您的个人经验,为了编写优化的查询,我应该考虑哪些事项? 是否有任何特定的命令(例如 JOIN、CASE)我应该尽可能优先或避免?另外,您如何衡量查询效率?
抱歉提出了开放性问题,我只是想围绕这个主题展开思考,并且很想听听有经验的人的意见。
问候
解决方法
“效率”是指以最少的努力完成目标。所以什么是有效的取决于目标,你不能说“如果查询的执行时间少于十分之一秒,它就会有效地执行”。本质上,如果没有明显更快的方法来完成任务,则查询是有效的。
另一种更实用的方法是使查询足够高效。如果它按照您的要求执行并且执行时间和资源使用符合您的目的,请不要担心。您还应该考虑将查询优化到理论最优(例如,通过创建专门的索引)可能会对系统的其他部分产生负面影响(例如,数据修改变慢)。您想优化系统的整体性能和资源使用。
综上所述,应该清楚的是,没有简单的清单可以让您工作以确保效率。但我可以给你一个简短的 SQL 反模式列表,根据我的经验,这些反模式通常会导致查询效率低下:
-
除非您确定需要,否则不要使用
DISTINCT
。通常需要排序,对于大集合来说开销很大。 -
Avoid
OR
inWHERE
conditions. 它往往会阻止使用索引。 -
仅当您确定内连接不起作用时才使用外连接。数据库重新排列此类连接的可能性较小。
-
使用规范化的数据模型。不要陷入在数据库中使用数组或 JSON 的陷阱。
-
除非您需要消除重复项,否则请使用
UNION ALL
而不是UNION
。这类似于DISTINCT
。 -
使用
WHERE EXISTS (/* subquery */)
而不是WHERE x IN (/* subquery */)
。IN
总是可以改写为EXISTS
,而 PostgreSQL 优化器更擅长处理后者。
这些规则应该被理解为经验法则。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。