Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 优化器如何处理对具有相同参数值的标量函数的调用?_Sql Server - Fatal编程技术网

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