查询优化的 SQL 提示 [关闭]
Posted
技术标签:
【中文标题】查询优化的 SQL 提示 [关闭]【英文标题】:SQL Tips for Query Optimization [closed] 【发布时间】:2021-02-05 07:11:22 【问题描述】:我是 SQL 新手,有一个关于优化的一般性问题。
根据您的个人经验,为了编写优化查询,我应该考虑哪些事项? 是否有任何特定的命令(例如 JOIN、CASE)我应该尽可能地尝试特权或避免?另外,您如何衡量查询效率?
很抱歉这个开放性问题,我只是想围绕这个主题来思考一下,并且很想听听有经验的人的意见。
问候
【问题讨论】:
【参考方案1】:“效率”是指用最少的努力完成一个目标。所以什么是有效的取决于目标,你不能说“如果查询不到十分之一秒,查询就会有效地执行”。从本质上讲,如果没有更快的方法来完成任务,则查询是有效的。
另一种更实用的方法是使查询足够高效。如果它完成了您希望它执行的操作,并且执行时间和资源使用符合您的目的,请不要担心。您还应该考虑将查询优化到理论上的最优值(例如,通过创建专门的索引)可能会对系统的其他部分产生负面影响(例如,数据修改变得更慢)。您希望优化系统的整体性能和资源使用情况。
话虽如此,应该清楚的是,没有简单的清单可以让您通过工作来确保效率。但我可以为您提供一个简短的 SQL 反模式列表,根据我的经验,这些反模式通常会导致查询效率低下:
除非您确定它是必需的,否则不要使用DISTINCT
。它通常需要排序,这对于大型集合来说非常昂贵。
Avoid OR
in WHERE
conditions.倾向于阻止索引被使用。
仅当您确定内部联接不起作用时才使用外部联接。数据库重新排列此类连接的可能性较小。
使用标准化数据模型。不要陷入在数据库中使用数组或 JSON 的陷阱。
使用UNION ALL
而不是UNION
,除非您需要消除重复。这类似于DISTINCT
。
使用WHERE EXISTS (/* subquery */)
而不是WHERE x IN (/* subquery */)
。 IN
总是可以重写为EXISTS
,而PostgreSQL 优化器更擅长处理后者。
这些规则应该被理解为经验法则。
【讨论】:
尽管如此,在这种情况下没有一刀切的规则。这已经很有帮助了,谢谢!以上是关于查询优化的 SQL 提示 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
有关 SQL Server 中的 SQL 查询提示的详细信息