繁体   English   中英

这2个“ where子句”中的哪一个执行得更好,为什么?

[英]Which one of these 2 “where clauses” perform better, and why?

好吧,问题很明确。 这是第一个查询:

SELECT
    o.Col1,
    o.Col2
FROM
    [Orders] o
WHERE
    ISNULL(@CustomerId, o.CustomerId) = o.CustomerId

这是另一个:

SELECT
    o.Col1,
    o.Col2
FROM
    [Orders] o
WHERE
    CASE
        WHEN @CustomerId IS NULL THEN 1
        ELSE IIF(@CustomerId = o.CustomerId, 1, 0)
    END = 1

谢谢。

更好的书写方式是:

SELECT
    o.Col1,
    o.Col2
FROM
    [Orders] o
WHERE
    @CustomerId IS NULL OR @CustomerId = o.CustomerId

至少查询优化器可以提前查看@CustomerId是否为null并相应地选择一个计划。

如果您关心性能,则可以使用动态SQL或类似的查询:

SELECT o.Col1, o.Col2
FROM Orders o
WHERE @CustomerId is null 
UNION ALL
SELECT o.Col1, o.Col2
FROM Orders o
WHERE o.CustomerId = @CustomerId;

第一个子查询将不使用索引,但应检测是否未返回任何值。 第二个仅在客户ID匹配时返回值,并且可以使用索引。

ISNULL(@CustomerId, o.CustomerId) = o.CustomerId

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM