我有一个使用标量函数的查询。唯一函数参数的值取自我查询中的字段(如下所示):
SELECT
fn_MyFunc(MyField)
FROM MyTable
如果这个表中有几千行,并且只有几个不同的值MyField
,优化器是否足够聪明,知道它以前已经看到过这个值,还是会一遍又一遍地执行函数?
我有一个使用标量函数的查询。唯一函数参数的值取自我查询中的字段(如下所示):
SELECT
fn_MyFunc(MyField)
FROM MyTable
如果这个表中有几千行,并且只有几个不同的值MyField
,优化器是否足够聪明,知道它以前已经看到过这个值,还是会一遍又一遍地执行函数?
用户定义函数仅存储执行计划。现有的优化器无法缓存这些有用的信息。标量 udf 是一个黑盒子。优化器不会为您手动记忆 UDF。
如果函数是确定性的,则提高性能的解决方案意味着相同的输入返回相同的输出,而与时间和数据库无关:
为这个 UDF 的所有可能结果创建一个表,并将这个表与查询连接起来。它将提供最佳性能/
简单的答案是否定的,它不够聪明,是的,它会执行该函数的次数与调用它的次数一样多。
如果您可以使用派生表创建不同的值,则可能会提高性能:
SELECT fn_MyFunc(distinct_field)
FROM (
SELECT
DISTINCT MyField as distinct_field
FROM MyTable) tbl
此外,解开函数的代码并将其嵌入到查询中可能会有所帮助。