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

问题描述 投票:1回答:3

我正在编写一个参数化查询,其中要求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

sql sql-server tsql
3个回答
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

这可以防止表扫描。


0
投票

不太确定你的查询逻辑。你的where子句

oi.PartId IS NULL OR oi.PartId LIKE '%'

和其他两个where子句只是字面意思是“选择我在PartID为null或PartID为非null的记录”。

由于PartID只能为NULL或不为null,为什么首先需要where子句?


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;
© www.soinside.com 2019 - 2024. All rights reserved.