0

我有一个表可以根据某些条件链接到其他几个表。请考虑以下 SQL:

DECLARE @someFlag nvarchar(1) = 'B'

select COUNT(SL_A.ID) + COUNT(SL_B.ID) + COUNT(SL_C.ID) as TotalLinks
from Customers C
left outer join SomeLookupA SL_A on
    @someFlag = 'A'
    AND C.SomeLookupAId = SL_A.ID
left outer join SomeLookupB SL_B on
    @someFlag = 'B'
    AND C.SomeLookupBId = SL_B.ID
left outer join SomeLookupC SL_C on
    @someFlag = 'C'
    AND C.SomeLookupCId = SL_C.ID   

如您所见,由于@someFlag 设置为“B”,因此由于@someFlag = '<?>'每个连接的条件,只有第二个左外连接将返回结果。

现在显然我可以将这个 SQL 分成 3 个单独的语句,这些语句将在一个条件块中运行:

if (@someFlag = 'A')
begin
    select COUNT(SL_A.ID) as TotalLinks
    from Customers C
    left outer join SomeLookupA SL_A on
        @someFlag = 'A'
        AND C.SomeLookupAId = SL_A.ID
end
else if (@someFlag = 'B')
... etc.... etc...

我个人更喜欢第一种方法,因为它更简洁。

我的问题是,SQL Server 引擎会优化多余的左连接吗?第一种方法的性能是否与第二种方法一样好?

4

1 回答 1

0

在这里。我想我也可以回答我自己的问题,以防其他人将来偶然发现这个问题。

看起来,使用我上面展示的条件外连接,表现不如第二种“非条件”方法。SQL Server 引擎仍然在这些连接上花费一些处理时间,即使它们不能返回额外的结果。您可以通过构建查询并打开评论中建议的“包括实际执行计划”选项来查看这一点。

TL;博士; 第二种方法更快。

于 2013-05-02T14:11:05.970 回答