Sql联接。。。多重还是多重?

Sql联接。。。多重还是多重?,sql,performance,join,query-optimization,Sql,Performance,Join,Query Optimization,因此,首先我要说的是,我为一家喜欢微优化的公司工作(而且有很好的理由)。我需要弄清楚的是,在使用2个联接时,或者在使用1个带有或的联接时,是否有性能的提高/降低 这不是一个完美的例子,但它应该能让人明白这一点。例如,您有以下3个表: dbo.CUSTOMER1 - CustomerId - CustomerName dbo.CUSTOMER2 - CustomerId - CustomerFauxId - CustomerName dbo.CUSTOMERINFO - Custo

因此,首先我要说的是,我为一家喜欢微优化的公司工作(而且有很好的理由)。我需要弄清楚的是,在使用2个联接时,或者在使用1个带有
的联接时,是否有性能的提高/降低

这不是一个完美的例子,但它应该能让人明白这一点。例如,您有以下3个表:

dbo.CUSTOMER1
 - CustomerId
 - CustomerName

dbo.CUSTOMER2
 - CustomerId
 - CustomerFauxId
 - CustomerName

dbo.CUSTOMERINFO
 - CustomerId
 - CustomerData
现在,您需要联接这些表,并查看它们是否在任一表中都有数据。从性能的角度来看,哪种方法会更好,或者两者之间有什么区别

第一个示例是当前如何编写查询。。。对我来说似乎是浪费

SELECT c1.CustomerId

FROM dbo.CUSTOMER1 c1

JOIN dbo.CUSTOMER2 c2
ON c1.CustomerId = c2.CustomerId

JOIN dbo.CUSTOMERINFO ci
ON ci.CustomerId = c1.CustomerId;

JOIN dbo.CUSTOMERINFO ci1
ON ci2.CustomerId = c2.CustomerFauxId;
我期待着沿着这些路线更新一些东西

SELECT c1.CustomerId

FROM dbo.CUSTOMER1 c1

JOIN dbo.CUSTOMER2 c2
ON c1.CustomerId = c2.CustomerId

JOIN dbo.CUSTOMERINFO ci
ON ci.CustomerId = c1.CustomerId
    OR ci.CustomerId = c2.CustomerFauxId;

您可以使用SQLServer中的查询执行计划功能来获取查询的性能详细信息

您可以使用SQLServer中的查询执行计划功能来获取查询的性能详细信息

我能想到的唯一逻辑查询是:

SELECT *
FROM dbo.CUSTOMER c JOIN
     dbo.CUSTOMERINFO ci
     ON c.CustomerId = Ci.CustomerId
WHERE c.CustomerId IN (@Customer1, @Customer2);
由于这两个表中的
CustomerId
上都有索引,我很难想出更高性能的版本


如果你想要两个客户在附加列中的数据,那么你会考虑两个“代码>连接/代码>版本。

我唯一能想到的逻辑查询是:

SELECT *
FROM dbo.CUSTOMER c JOIN
     dbo.CUSTOMERINFO ci
     ON c.CustomerId = Ci.CustomerId
WHERE c.CustomerId IN (@Customer1, @Customer2);
由于这两个表中的
CustomerId
上都有索引,我很难想出更高性能的版本


如果你想要两个客户在附加列中的数据,那么你会考虑两个->代码>连接< /代码>版本。

它们在第一个地方不返回相同的结果。在第一种情况下,返回
CustomerFauxId
CustomerId
都存在于
CUSTOMERINFO
表中的客户。在第二种情况下,您返回存在
CustomerFauxId
CustomerId
的客户,当这两个客户都存在时,您可以获得同一客户两次


在主键上加入CUSTOMER1和CUSTOMER2这一事实也有点可疑。如果没有更广阔的视野,很难判断,但我强烈建议在进行任何微观优化之前,先关注模式设计和适当的索引。

它们首先不会返回相同的结果。在第一种情况下,返回
CustomerFauxId
CustomerId
都存在于
CUSTOMERINFO
表中的客户。在第二种情况下,您返回存在
CustomerFauxId
CustomerId
的客户,当这两个客户都存在时,您可以获得同一客户两次


在主键上加入CUSTOMER1和CUSTOMER2这一事实也有点可疑。如果没有更广阔的视野,很难判断,但我强烈建议在进行任何微观优化之前,将重点放在模式设计和适当的索引上。

您根本无法加入表。你看到了吗?
join
条件缺失。即。执行了交叉联接。@vkp您是正确的。我在写这篇文章的时候正在处理其他的事情。哑巴,哑巴。请再次检查。或者通常是禁忌的,它是最慢的结构之一,尤其是在连接中。当然,在任何情况下都不应该使用SELECT*,因为您多次返回连接,这是浪费网络资源。不要考虑试图使SQL代码更优雅,看起来最坏的事情往往是更好的表演者。只有当您有性能问题并且可以证明新方法的性能更好时,才可以这样更改代码。永远不要更改SQL代码以使其看起来更漂亮(实际代码不变的格式除外)。您根本不需要加入表。你看到了吗?
join
条件缺失。即。执行了交叉联接。@vkp您是正确的。我在写这篇文章的时候正在处理其他的事情。哑巴,哑巴。请再次检查。或者通常是禁忌的,它是最慢的结构之一,尤其是在连接中。当然,在任何情况下都不应该使用SELECT*,因为您多次返回连接,这是浪费网络资源。不要考虑试图使SQL代码更优雅,看起来最坏的事情往往是更好的表演者。只有当您有性能问题并且可以证明新方法的性能更好时,才可以这样更改代码。永远不要更改SQL代码以使其看起来更漂亮(实际代码不变的格式设置除外)。