繁体   English   中英

标量值 function 在 where 子句中的使用导致性能问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM