You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JOIN附加条件与WHERE子句的SQL查询性能对比咨询

两条SQL查询的性能对比分析

先明确两个查询语句:

Query #1

select t1.PK 
from table1 as t1 
join table2 as t2 on t1.pk = t2.pk .... 
where t1.someattribute = somecondition

Query #2

select t1.PK 
from table1 as t1 
join table2 as t2 on (t1.pk = t2.pk 
                      and t1.someattribute = somecondition)

性能差异与核心原因

在现代关系型数据库(如MySQL、PostgreSQL、SQL Server等)中,这两条语句的执行效率几乎没有差异,原因如下:

  • 数据库的查询优化器会自动对查询语句做等价重写,生成完全相同的执行计划。优化器能识别出t1.someattribute = somecondition是针对table1的单表过滤条件,不管写在JOIN的ON子句还是WHERE子句,都会优先过滤table1中不符合条件的行,再与table2执行JOIN操作,不会出现先全量JOIN再过滤的情况。
  • 你测试时两者差异不大,正是因为优化器已经完成了这种等价转换,实际的执行逻辑完全一致。

关于过滤时机的疑问

把t1.someattribute = somecondition写在ON子句里,并不会比写在WHERE子句更早减少处理行数:

  • 优化器会自动选择最优的执行顺序,优先处理单表过滤,再进行JOIN,所以最终参与JOIN的行数是相同的。
  • 只有当使用外连接(LEFT/RIGHT JOIN),或者过滤条件涉及到JOIN双方的关联字段时,ON和WHERE子句的逻辑才会产生差异;对于内连接(JOIN/INNER JOIN),针对单表的过滤条件写在哪个位置,执行计划都是等价的。

内容的提问来源于stack exchange,提问作者user1532449

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:33:12