【发布时间】:2018-08-08 17:49:59
【问题描述】:
我正在编写一个参数化查询,其中要求LIKE 子句在field LIKE '%' 时包含NULL 值。
我有多种解决方案;我并排运行这些查询,它们返回具有相同摘要的相似执行计划,并且查询时间相似。我担心这些查询如何提高具有数百万条记录的表的性能。
-- 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 相比,性能影响是什么?
【问题讨论】:
-
我认为第一个查询不能按预期工作,因为它返回带有空值的行而不查看 @CustomerName
-
这些不是执行计划,它们只是计划的摘要。右键单击并点击 Show XML 以查看实际计划。通过比较 XML,您会发现它们实际上是否在做同样的事情,或者它们是否恰好具有相同的摘要。
-
搜索逻辑会影响性能。这是一个愚蠢的扫描,没有机会发生其他任何事情。由于特定的数据模型和搜索逻辑。在给定条件下使用“ISNULL”不会比更改 T-short 效果更好。
-
像这样的 Catch-All 查询最好用动态 sql 处理。 sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries
-
您还可以通过添加 SET STATISTICS TIME, IO ON; 获得一些额外的见解;然后将几个不同的参数选项传递给所有三个查询。
标签: sql sql-server tsql