这 2 "where clauses" 中哪一个表现更好,为什么?

Which one of these 2 "where clauses" perform better, and why?

嗯,问题crystal清楚了。这是第一个查询:

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;

第一个子查询不会使用索引,但应该检测是否没有返回值。第二个只有 returns 客户 ID 匹配时的值,并且可以使用索引。

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