2

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

SELECT
    fn_MyFunc(MyField)
FROM MyTable

如果这个表中有几千行,并且只有几个不同的值MyField,优化器是否足够聪明,知道它以前已经看到过这个值,还是会一遍又一遍地执行函数?

4

2 回答 2

2

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

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

为这个 UDF 的所有可能结果创建一个表,并将这个表与查询连接起来。它将提供最佳性能/

于 2012-06-02T17:36:10.623 回答
1

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

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

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

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

于 2012-06-02T17:49:09.373 回答