我正在撰写参数化查询,其中LIKE
子句要求在NULL
时包含field LIKE '%'
值。
我有多种解决方案;我并排运行这些查询,他们使用相同的摘要返回类似的执行计划,查询时间也相似。我担心这些查询如何扩展具有数百万条记录的表的性能。
-- Where @PartId is typically '%' or could be 'Part123%'.
SELECT *
FROM dbo.OrderItems AS oi
WHERE oi.PartId IS NULL OR oi.PartId LIKE @PartId
SELECT *
FROM dbo.OrderItems AS oi
WHERE ISNULL(oi.PartId, '') LIKE @PartId
SELECT *
FROM dbo.OrderItems AS oi
WHERE COALESCE(oi.PartId, '') LIKE @PartId
此question表明ISNULL
和COALESCE
之间的差异非常小。 Grant Fritchey在此article中演示了在WHERE
子句中应用函数会导致比使用LIKE
更大的性能障碍,但是我已经读过使用逻辑OR
会导致性能问题在查询中。使用IS NULL OR
与ISNULL
的替代方案对性能产生的影响是什么?
答案 0 :(得分:2)
您没有粘贴所选择的计划,但我只能假设它涉及表扫描?
有时候值得重写SQL以使用联合查询,而不是使用“WHERE CONDITION1 OR CONDITION2”:
SELECT *
FROM dbo.Customers AS c
WHERE c.Name IS NULL
UNION ALL
SELECT *
FROM dbo.Customers AS c
WHERE c.Name = @CustomerName
可以阻止表扫描。
答案 1 :(得分:0)
不太确定您的查询逻辑。你的where子句
oi.PartId IS NULL OR oi.PartId LIKE '%'
和其他两个where 字面的子句意味着"选择PartID为null的记录或 PartID为 NOT null&#34 ;
由于PartID只能为NULL或不为null,为什么首先需要where子句?
答案 2 :(得分:0)
like '%'
进行测试是有缺陷的结果。如果您将like
替换为=
,则仍然存在缺陷。
这些查询会返回不同的结果!
declare @match varchar(10) = '%match%';
declare @val varchar(10) = null;
select 'yes'
where @val is null or @val like @match;
select 'yes'
where isnull(@val, '') like @match;