这 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
嗯,问题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