使用IS NULL OR与ISNULL一起使用LIKE会对性能产生什么影响?

时间:2018-02-28 18:46:54

标签: sql sql-server tsql

我正在撰写参数化查询,其中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表明ISNULLCOALESCE之间的差异非常小。 Grant Fritchey在此article中演示了在WHERE子句中应用函数会导致比使用LIKE更大的性能障碍,但是我已经读过使用逻辑OR会导致性能问题在查询中。使用IS NULL ORISNULL的替代方案对性能产生的影响是什么?

编辑:这是查询的执行计划摘要: enter image description here

3 个答案:

答案 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;