优化器如何使用相同的参数值处理对标量函数的调用?

时间:2012-06-02 17:29:48

标签: sql-server

我有一个查询,我使用标量函数。唯一函数参数的值取自我的查询中的字段(如下所示):

SELECT
    fn_MyFunc(MyField)
FROM MyTable

如果此表中有几千行,并且MyField中只有几个不同的值,那么优化器是否足够聪明,知道它之前已经看过该值,或者它仍然会执行该函数又一次?

2 个答案:

答案 0 :(得分:2)

用户定义的函数仅存储执行计划。现有的优化器都无法缓存这些有用的信息。标量udf是一个黑盒子。优化器不会为您手动记忆UDF。

如果函数是确定性的,则提高性能的解决方案意味着相同的输入返回与时间和数据库无关的相同输出:

为此UDF的所有可能结果创建一个表,并将该表与查询一起加入。它将提供最佳性能/

答案 1 :(得分:1)

简单的答案是否定的,它不够聪明,是的,它会在调用时多次执行该函数。

如果您可以使用派生表创建不同的值,则可能会提高性能:

SELECT fn_MyFunc(distinct_field) 
FROM (
    SELECT
        DISTINCT MyField as distinct_field
     FROM MyTable) tbl

此外,展开函数的代码并将其嵌入查询中可能会有所帮助。