[英]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.