显式与隐式SQL连接

时间:2020-03-05 18:47:56  来源:igfitidea点击:

显式和隐式内部联接是否存在效率差异?
例如:

SELECT * FROM
table a INNER JOIN table b
ON a.id = b.id;

SELECT a.*, b.*
FROM table a, table b
WHERE a.id = b.id;

解决方案

回答

在性能方面,它们是完全相同的(至少在SQL Server中)。

PS:请注意,自SQL Server 2005起不建议使用" IMPLICIT OUTER JOIN"语法。(仍支持该问题中使用的" IMPLICIT INNER JOIN"语法)。

弃用"旧样式" JOIN语法:只是部分事情

回答

就我个人而言,我更喜欢联接语法,因为它可以使表更清楚地说明联接表以及联接方式。尝试比较较大的SQL查询,从8个不同的表中进行选择,然后在where中进行大量筛选。通过使用连接语法,可以将连接表的部分分离到要过滤行的部分。

回答

Performance wise, they are exactly the same (at least in SQL Server) but be aware that they are deprecating this join syntax and it's not supported by sql server2005 out of the box.

我认为我们正在考虑不赞成使用的* =和= *运算符与"外部连接"。

我刚刚测试了给定的两种格式,它们在SQL Server 2008数据库上可以正常工作。以我为例,他们得出了相同的执行计划,但是我不能自信地说这永远是正确的。

回答

在某些数据库(尤其是Oracle)上,联接的顺序可能会对查询性能产生巨大的影响(如果有两个以上的表)。在一个应用程序上,在某些情况下,我们实际上有两个数量级的差异。如果使用正确的提示语法,则使用内部连接语法可让我们对此进行控制。

我们没有指定正在使用的数据库,但是有可能表明SQL Server或者MySQL没有什么实际的区别。

回答

@lomaxx:只是为了澄清一下,我很确定SQL Serv 2005支持上述两种语法。但是不支持以下语法

select a.*, b.*  
from table a, table b  
where a.id *= b.id;

具体来说,不支持外部联接(* =)。

回答

我们给出的第一个答案使用了所谓的ANSI连接语法,另一个答案有效并且可以在任何关系数据库中使用。

我同意grom,我们应该使用ANSI连接语法。正如他们所说,主要原因是为了清晰。而不是使用带有很多谓词的where子句,其中一些联接表和其他限制使用ANSI联接语法返回的行,而是使我们盲目地弄清楚了哪些条件用于联接表,哪些条件用于限制表。结果。

回答

就像Leigh Caldwell所说的那样,查询优化器可以根据功能上看起来像相同的SQL语句生成不同的查询计划。有关此内容的更多信息,请查看以下两个博客文章:-

Oracle Optimizer团队的一篇帖子

来自"结构化数据"博客的另一篇文章

希望我们觉得这很有趣。

回答

第二种语法具有交叉联接的可能性:我们可以将表添加到FROM部分,而无需相应的WHERE子句。这被认为是有害的。