SQL多表查询中JOIN操作的执行顺序是怎样的?
多表JOIN执行顺序解答
你用到的多表关联查询语句如下:
select * from table1 join table2 on table1.col1 = table2.col2 join table3 on table2.col3 = table3.col3
你猜测的两种执行方式都不完全准确,需要分两个层面说明:
- 逻辑语义层面(SQL标准定义的执行规则)
你写的未指定类型的JOIN默认是内连接(INNER JOIN),逻辑上是逐次关联处理:每次取两个待关联的数据集做笛卡尔积,立刻应用当前关联对应的ON条件过滤掉不匹配的行,得到合法的中间结果;再用这个中间结果和下一个表重复上述关联、过滤流程,直到所有表处理完成。整个过程不会等所有表都拼完生成超大的全量笛卡尔积再统一过滤,那种处理方式会产生完全无意义的天量中间数据,没有任何实用数据库会这么设计。 - 实际物理执行层面(数据库引擎真实运行逻辑)
主流数据库(MySQL、PostgreSQL、Oracle、SQL Server等)都不会死板按照你书写的表顺序逐次关联。由于内连接满足交换律和结合律,只要最终返回结果一致,优化器可以自由调整关联顺序——它会基于表的统计信息(比如各表总行数、关联字段的索引情况、条件过滤后的预估结果大小等)计算不同关联顺序的执行成本,选成本最低的路径执行。比如如果table2和table3关联后结果集极小,优化器完全可能先关联这两个表,再把结果和table1做匹配,最终返回的结果和按书写顺序关联完全一致。
特殊情况:如果用的是外连接(
LEFT JOIN/RIGHT JOIN/FULL JOIN),关联顺序会直接影响最终结果(比如左连接必须保留左表全部匹配/不匹配的行),优化器不会随意调整会改变结果语义的关联顺序,但依然会在每一步关联时就用ON条件提前过滤数据,不会生成全量笛卡尔积。
最后补充:只要关联字段建了合适的索引,数据库在做两表匹配时连逐行遍历笛卡尔积的操作都不会做,会直接通过索引定位符合条件的记录,查询效率会大幅提升。
内容的提问来源于stack exchange,提问作者Nourless
相关产品推荐
相关产品推荐

