我正在重写一些编写不良的SQL查询语句,它们过度使用子查询。我正在寻找有关使用子查询的最佳实践。
非常感谢您的帮助。
我正在重写一些编写不良的SQL查询语句,它们过度使用子查询。我正在寻找有关使用子查询的最佳实践。
非常感谢您的帮助。
子查询通常没问题,除非它们是相关子查询(也称为关联子查询)。如果您只使用独立子查询,并且它们使用适当的索引,则应该可以快速运行。如果你有一个依赖子查询,你可能会遇到性能问题,因为一个依赖子查询通常需要针对外部查询中的每一行运行一次。所以,如果您的外部查询有1000行,那么子查询将运行1000次。另一方面,独立子查询通常只需要评估一次。
如果您不确定什么是依赖或独立子查询,这里有一个经验法则 - 如果您可以从上下文中移除子查询,运行它并获得结果集,则它是一个独立子查询
。
如果出现语法错误,因为它引用了子查询之外的某些表,则它是一个依赖子查询
。
当然,一般规则有一些例外。例如:
如果性能是一个问题,那么测量您特定的查询并查看哪种方法最好。
这里没有银弹。每种用法都必须独立评估。有些情况下,相关子查询明显效率低下,下面的例子最好改为使用JOIN。
select nickname, (select top 1 votedate from votes where user_id=u.id order by 1 desc)
from users u
另一方面,EXISTS和NOT EXISTS查询将优于JOIN。
select ...
where NOT EXISTS (.....)
select ...
FROM A LEFT JOIN B
where B.ID is null
然而,即使是这些概括也可能对于任何特定的模式和数据分布都不正确。
不幸的是,答案很大程度上取决于您使用的SQL服务器。从纯关系理论的角度来看,连接更好。它们让服务器在幕后做正确的事情,并给予它们更多的控制权,因此最终可能会更快。 如果 服务器实现得好的话。实际上,一些SQL服务器通过子查询等技巧来优化查询时表现更好。