子查询和 JOINS 的性能?

Performance on subqueries and JOINS?

问题 1: 关于性能,哪个是最好的:子查询还是 JOIN?

问题2:有什么方法可以衡量比较运行子查询或JOIN的时间吗?

编辑

我有点困惑,虽然比以前少了。我找到了这个 http://www.akadia.com/services/sqlsrv_subqueries.html

结合下面的答案,它总结得很好。

子查询与 JOIN

如果执行 JOIN 的字段已编入索引,则 JOIN 通常会更快。子查询可用于根据索引提取非常小的子集并连接到主 table。根据我的经验,JOIN 在性能方面表现出色。不同的数据库可能会以不同的方式优化 JOIN 和子查询。您可能会在 SQL 服务器和 MySQL(以及它们的不同版本)上得到不同的结果。所以 measurement/estimation 的性能是必不可少的,这将我们带到下一个问题

Measure/estimation 时间

我的偏好是使用 JOIN 和子查询对查询执行 EXPLAIN 和 EXPLAIN EXTENDED,以了解数据库(假设 MySQL)如何使用索引。 运行 针对当前数据集的查询,然后创建一个比当前数据集大 3-5 倍的更大的虚拟数据集,运行 在非生产系统上针对它们的查询。这将为您提供查询 运行.

所需的秒数

在SQL服务器上,当你解释时,你会看到费用数字。您可以将 JOIN 查询与子查询查询进行比较,然后使用当前数据集和比当前数据集大 3-5 倍(或 10 倍)的数据集执行 运行 以查看您的查询执行。

如今,RDBMS 拥有非常智能和强大的优化器。他们将自动在 JOIN 和子查询之间做出决定,而不管您的确切代码是什么。在您真正遇到性能问题之前,不要开始手动优化。

没有通用的答案。这取决于您使用的平台(Microsoft SQL Server、Oracle、MySQL 等)以及查询。

正如 PM 77-1 所说,如今的优化器非常擅长将查询的关系代数解析为最有效的执行计划。但是每个服务器和每个查询都是不同的。在 SQL Server 你可以查看 Estimated Execution plan 来比较不同的查询,看看优化器将如何选择执行它。大多数平台都有类似的概念,比如 EXPLAIN。

这个主题非常广泛,需要对每个平台、每个数据库和查询进行大量试验。擅长性能调优是一门值得探索的艺术。

There are a lot of opinions about JOINs vs Subqueries.

Chris London 有一篇关于此主题的精彩文章。

So it seems like the verdict is to do subqueries. The reason the subquery in the join is faster than the subquery in the where clause is, I believe, because when it’s in the where it has to run that condition for every row whereas it only has to run it once for the subquery/join. Like I said before different RDBMSs handle things differently but even if your RDBMS doesn’t handle subqueries as well others, to me, they are more readable. So now I recommend subqueries!

来源:http://www.chrislondon.co/joins-vs-subqueries/