这些2"哪个条款中的哪一个"表现更好,为什么?

时间:2015-11-06 00:42:25

标签: sql sql-server query-performance

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

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

谢谢。

2 个答案:

答案 0 :(得分:2)

更好的写作方式是:

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

如果@CustomerId为空,至​​少查询优化器可以提前看到,并相应地选择一个计划。

答案 1 :(得分:0)

如果您关心性能,那么您可以使用动态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