DB2 for i:非udf宏函数?(自定义函数比较慢,但是复杂的公式比较复杂)



我需要执行复杂但相当一致的公式。

在大型表上执行UDF时,速度慢得令人难以置信,因此我宁愿避免使用它们(在大型表上,SELECT子句中使用UDF的执行时间比使用等效的内联语句慢30-100倍)

我可以写内联公式代替,但是结果代码太大,难以读,而且更难维护。

是否有一种方法来设计像C或SAS宏这样的东西,它只是在查询中做直接的文本替换?

我想要像下面这样的东西

给定:

isKeyValid(key, param1, param2)

生成的代码:(这只是我在飞行中随机写的废话-它应该支持任何数量的原始SQL)

case 
when param1 in ('a','b','c') and substr(param2,1,2) = '53' and key=param1||param2 then 1
when param1 in ('a','d','e') and substr(param2,1,2) = '51' and key=param1||param2 then 1
else 0 
end

我从未见过任何udf在I…

你使用的是哪个版本和发行版?假设是当前版本(v7.2或更高版本),请查看2016年对UDF内联的增强,以确保您的代码可以内联。

用户定义表函数(udtf)的内联支持
改进的SQL标量用户定义函数(udf)的内联支持

内联函数:当SQL标量函数被内联时,而不是调用函数作为查询的一部分,RETURN中的表达式函数的语句可以被复制(内联)到查询中本身。这样的函数称为内联函数。一个标量如果:

  • SQL函数是全局确定性的
  • SQL-routine-body只包含一个RETURN语句。
  • 没有输入参数是数组类型
  • 结果的数据类型不是XML或数组类型。
  • 函数中引用的所有对象在创建函数时都存在。
  • SQL-routine-body不包含引用输入参数的公共表表达式。
  • SQL-routine-body不包含没有前面引用输入的LATERAL关键字的嵌套表表达式参数。

内联函数只有在下列情况下才会被复制(内联)到查询中:

  • 查询符合SQL查询引擎(SQE)的条件。
  • 函数引用一个对象,并且函数的权限属性和查询的权限属性基于以下条件:
    • 函数定义在用户权限(* user)下运行。
    • 查询在所有者权限下运行(* owner),查询的所有者与函数的所有者相同。
    • 查询在用户权限(* user)下运行,该用户或该用户所属组的配置文件与配置文件的所有者相同函数。

注意:如果函数定义为FENCED,则查询不能使用采用权威。如果查询在所有者的权限下运行(*OWNER)和函数在用户权限(* user)下运行,则查询的所有者必须与用户或用户组相同概要。

特别要注意强调的要求,即函数只包含一个RETURN。如果你有一个使用BEGINEND的复合语句;你的函数不会被内联。

相关内容

  • 没有找到相关文章

最新更新