Sql server 优化器如何处理对具有相同参数值的标量函数的调用?
我有一个使用标量函数的查询。唯一函数参数的值取自我的查询中的字段(如下所示):Sql server 优化器如何处理对具有相同参数值的标量函数的调用?,sql-server,Sql Server,我有一个使用标量函数的查询。唯一函数参数的值取自我的查询中的字段(如下所示): 如果此表中有几千行,并且在MyField中只有几个不同的值,那么优化器是否足够聪明,能够知道它之前已经看到了该值,还是仍然会反复执行该函数?用户定义的函数只存储执行计划。现有的任何优化程序都无法缓存这些有用的信息。标量udf是一个黑盒。优化器不会为您手动记忆UDF 如果函数是确定性的,则提高性能的解决方案意味着相同的输入返回相同的输出,而与时间和数据库无关: 为此UDF的所有可能结果创建一个表,并将该表与该查询连接起
如果此表中有几千行,并且在
MyField
中只有几个不同的值,那么优化器是否足够聪明,能够知道它之前已经看到了该值,还是仍然会反复执行该函数?用户定义的函数只存储执行计划。现有的任何优化程序都无法缓存这些有用的信息。标量udf是一个黑盒。优化器不会为您手动记忆UDF
如果函数是确定性的,则提高性能的解决方案意味着相同的输入返回相同的输出,而与时间和数据库无关:
为此UDF的所有可能结果创建一个表,并将该表与该查询连接起来。它将提供最佳性能/简单的答案是不,它不够智能,是的,它将执行函数的多次调用 如果可以使用派生表创建不同的值,则可能会提高性能:
SELECT fn_MyFunc(distinct_field)
FROM (
SELECT
DISTINCT MyField as distinct_field
FROM MyTable) tbl
此外,展开函数代码并将其嵌入查询可能会有所帮助 非常确定它不会缓存这些信息,除非在编译查询时参数是固定的。您说的是内联函数,但您使用的语法更像是标量UDF。这些不是内联的。唯一的内联函数是TVFs。有时,将标量UDF转换为内联函数可以提高性能,如下所示马丁:你说得对。问题已被编辑。这里是一篇相关的博客文章。
SELECT fn_MyFunc(distinct_field)
FROM (
SELECT
DISTINCT MyField as distinct_field
FROM MyTable) tbl