Sql JOINs ...多个还是OR?

时间:2016-05-13 14:24:47

标签: sql performance join query-optimization

首先,我会说我为一家喜欢微优化的公司工作(并且有充分的理由)。我需要弄清楚的是,如果使用2个连接有任何性能增加/减少,或者1个连接有OR就可以了。

这不是一个完美的例子,但它应该得到重点。例如,你有这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;

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

他们首先不会返回相同的结果。在第一种情况下,您返回CustomerFauxId表中存在CustomerIdCUSTOMERINFO的客户。在第二种情况下,您将返回存在CustomerFauxIdCustomerId的客户,并且当两者都存在时,您可以获得相同的客户两次。

在主键上加入CUSTOMER1和CUSTOMER2这一事实也有些可疑。没有更广泛的观点很难说,但我会强烈建议在进行任何微观优化之前专注于模式设计和正确的索引。

答案 2 :(得分:0)

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

SELECT *
FROM dbo.CUSTOMER c JOIN
     dbo.CUSTOMERINFO ci
     ON c.CustomerId = Ci.CustomerId
WHERE c.CustomerId IN (@Customer1, @Customer2);

在两个表中都有CustomerId的索引,我很难想到一个性能更高的版本。

如果您想要其他列中的两个客户的数据,那么您会考虑两个 - JOIN版本。