SQL查询优化技巧



我是SQL新手,有一个关于优化的一般性问题。

根据你的个人经验,为了写一个优化的查询,我应该考虑什么?是否有任何特定的命令(例如JOIN, CASE)我应该尝试特权或避免,只要有可能?另外,如何度量查询效率

?很抱歉提出这个开放性的问题,我只是想弄清楚这个问题,我很想听听有经验的人的意见。

效率"指用最少的努力完成一个目标。因此,什么是高效取决于目标,您不能说"如果查询执行时间少于十分之一秒"之类的话。从本质上讲,如果没有实质上更快的方法来执行任务,那么查询是有效的。

另一种更实用的方法是使查询足够有效。如果它完成了您想要它完成的任务,并且执行时间和资源使用符合您的目的,那么就不要担心了。您还应该考虑将查询优化到理论上的最优值(例如,通过创建专门的索引)可能会对系统的其他部分产生负面影响(例如,数据修改变得更慢)。您需要优化系统的整体性能和资源使用。

说了这么多,应该清楚的是,不可能有一个简单的检查表,你可以通过它来确保效率。但是我可以给你一个简短的SQL反模式列表,在我的经验中,这些模式经常导致低效的查询:

  • 不要使用DISTINCT,除非你确定它是必需的。它通常需要排序,这对于大集合来说是非常昂贵的。

  • WHERE条件下避免OR。它倾向于阻止索引的使用。

  • 只有在确定内部连接无法完成任务时才使用外部连接。数据库重新排列这种连接的可能性更小。

  • 使用规范化数据模型。不要落入在数据库中使用数组或JSON的陷阱。

  • 使用UNION ALL代替UNION,除非您需要消除重复。这与DISTINCT类似。

  • 使用WHERE EXISTS (/* subquery */)而不是WHERE x IN (/* subquery */)IN总是可以重写为EXISTS, PostgreSQL优化器更擅长处理后者。

这些规则应该被理解为经验法则。

最新更新