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
相关产品推荐
相关产品推荐

