如何解决where 子句中的标量值函数使用导致性能问题
我有一个 sql 查询,它在 where 子句中使用了标量值函数。
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
我检查了执行计划,它对两个查询都进行了全表扫描。
解决方法
将函数调用移至 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;
在您的版本中,需要为表中的所有行调用标量函数——这会增加开销。如果可用,此版本实际上可能能够使用 SomeId
上的索引。
你也可以声明一个变量来保存值:
DECLARE @ID int = fn_ScalarValueFunction(100)
SELECT TOP 1 *
FROM TableName T
WHERE T.SomeID = @ID
ORDER BY T.SomeDate
,
您可以尝试使用带有子查询的内部联接来仅获取一次标量函数的结果,如下所示
SELECT TOP 1 *
FROM TableName T
inner join
(select fn_ScalarValueFunction(100) as 'scalarID')t1
on t.someID = t1.scalarID
ORDER BY T.SomeDate
,
您是否尝试过将标量函数包装在这样的 select 子句中:
SELECT TOP 1 *
FROM TableName T
WHERE T.SomeID = (select fn_ScalarValueFunction(100))
ORDER BY T.SomeDate
通过使用类似的查询,我获得了明显更好的性能。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。