[英]Avoid function in where clause,due to that its causing performance issue?
[英]Scalar value function usage in the where clause causing performance issue
我有一个 sql 查询,它在 where 子句中使用标量值 function。
SELECT TOP 1 *
FROM TableName T
WHERE T.SomeID = fn_ScalarValueFunction(100)
ORDER BY T.SomeDate
执行查询大约需要 1 分钟。 但是,如果我单独运行以下查询,它们会在一秒钟内运行。
SELECT fn_ScalarValueFunction(100) = 123
SELECT TOP 1 *
FROM TableName T
WHERE T.SomeID = 123
ORDER BY T.SomeDate
我检查了执行计划,它对两个查询都进行了全表扫描。
如何提高慢查询的性能?
将 function 调用移至FROM
子句:
SELECT TOP 1 T.*
FROM TableName T CROSS JOIN
(VALUES (fn_ScalarValueFunction(100)) v(val)
WHERE T.SomeID = v.val
ORDER BY T.SomeDate;
在您的版本中,需要为表中的所有行调用标量 function - 这会增加开销。 如果可用,此版本实际上可能能够使用SomeId
上的索引。
您还可以声明一个变量来保存该值:
DECLARE @ID int = fn_ScalarValueFunction(100)
SELECT TOP 1 *
FROM TableName T
WHERE T.SomeID = @ID
ORDER BY T.SomeDate
您可以尝试使用带有子查询的内连接来仅获得一次标量 function 的结果,如下所示
SELECT TOP 1 *
FROM TableName T
inner join
(select fn_ScalarValueFunction(100) as 'scalarID')t1
on t.someID = t1.scalarID
ORDER BY T.SomeDate
您是否尝试将标量 function 包装在 select 子句中,如下所示:
SELECT TOP 1 *
FROM TableName T
WHERE T.SomeID = (select fn_ScalarValueFunction(100))
ORDER BY T.SomeDate
通过使用类似的查询,我得到了明显更好的性能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.