显式内连接和隐式内连接在效率上有区别吗? 例如:
SELECT * FROM
table a INNER JOIN table b
ON a.id = b.id;
vs.
SELECT a.*, b.*
FROM table a, table b
WHERE a.id = b.id;
显式内连接和隐式内连接在效率上有区别吗? 例如:
SELECT * FROM
table a INNER JOIN table b
ON a.id = b.id;
vs.
SELECT a.*, b.*
FROM table a, table b
WHERE a.id = b.id;
当前回答
第二种语法具有不必要的交叉连接的可能性:您可以向FROM部分添加表而不对应WHERE子句。这被认为是有害的。
其他回答
在性能方面,它们是完全相同的(至少在SQL Server中)。
PS:请注意,自SQL Server 2005以来,隐式OUTER JOIN语法已弃用。(仍然支持问题中使用的隐式INNER JOIN语法)
“旧样式”JOIN语法的弃用:只是部分内容
在一些数据库(尤其是Oracle)中,连接的顺序会对查询性能产生巨大的影响(如果有两个以上的表)。在一个应用程序中,我们在某些情况下有两个数量级的差异。如果使用正确的提示语法,使用内部连接语法可以控制这一点。
您没有指定使用哪个数据库,但可能建议使用SQL Server或MySQL,在那里它没有真正的区别。
就性能而言,它不应该有任何区别。显式连接语法对我来说似乎更干净,因为它清楚地定义了from子句中表之间的关系,并且没有混淆where子句。
根据我的经验,使用带有where子句的交叉连接语法通常会导致执行计划受到破坏,特别是在使用Microsoft SQL产品时。例如,SQL Server试图估计表行数的方法非常可怕。使用内部连接语法可以在一定程度上控制查询的执行方式。因此,从实用的角度来看,鉴于当前数据库技术的返祖性质,您必须使用内部连接。
正如Leigh Caldwell所述,查询优化器可以根据功能上类似于相同SQL语句的内容生成不同的查询计划。欲进一步阅读,请参阅以下两篇博客文章:-
一篇来自Oracle优化团队的帖子
另一篇来自“结构化数据”博客的文章
我希望你会觉得这很有趣。