首页 > 数据库 > mysql教程 > JOIN 查询中的 WHERE 与 ON 子句:何时应使用 Which 以获得最佳性能?

JOIN 查询中的 WHERE 与 ON 子句:何时应使用 Which 以获得最佳性能?

Mary-Kate Olsen
发布: 2025-01-04 09:58:35
原创
137 人浏览过

WHERE vs. ON Clause in JOIN Queries: When Should I Use Which for Optimal Performance?

JOIN 查询中的 WHERE 子句与 ON:性能影响

在 T-SQL 中使用 JOIN 查询时,通常会遇到以下选择:将过滤条件放在 WHERE 子句或 ON 子句中。虽然这两种方法可以产生相同的结果集,但需要考虑细微的性能差异。

具体来说,让我们检查以下查询:

SELECT *
FROM Foo f
INNER JOIN Bar b ON (b.BarId = f.BarId);
WHERE b.IsApproved = 1;
登录后复制

相比:

SELECT *
FROM Foo f
INNER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId);
登录后复制

两个查询返回相同的行集,但性能特征不同。

一般来说,将过滤器放在ON 子句是首选,原因如下:

  • 优化联接操作: ON 子句在联接任何行之前进行评估,允许数据库有选择地仅联接满足条件的行指定的标准。这样可以实现更高效的连接过程。
  • 最小化结果集大小:通过在 ON 子句中进行过滤,可以减少接受 WHERE 子句评估的行数,从而导致可能会更小的结果集。

但是,在某些情况下,将过滤器放在 WHERE 子句中是必要:

  • 外部联接:外部联接包括左表中的行,即使右表中没有匹配的行也是如此。将过滤器放在 WHERE 子句中允许您在连接发生后过滤结果集。
  • 可选过滤: 可选过滤器允许即使不满足连接条件也返回行。例如,以下查询要求 b.IsApproved 为 NULL 或 1:
SELECT *
FROM Foo f
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved IS NULL OR b.IsApproved = 1);
登录后复制

结论:

当关注性能时,请考虑放置ON 子句中的过滤条件可优化联接操作并减少结果集大小。对于外连接或可选过滤,必须使用 WHERE 子句来实现所需的过滤。

以上是JOIN 查询中的 WHERE 与 ON 子句:何时应使用 Which 以获得最佳性能?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板