Sql联接。。。多重还是多重?
因此,首先我要说的是,我为一家喜欢微优化的公司工作(而且有很好的理由)。我需要弄清楚的是,在使用2个联接时,或者在使用1个带有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
或的联接时,是否有性能的提高/降低
这不是一个完美的例子,但它应该能让人明白这一点。例如,您有以下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代码以使其看起来更漂亮(实际代码不变的格式设置除外)。