扩展UDF支持多线程并行计算,但有如下限制:
1、UDF函数的串/并行执行需要由用户自己做出判断,并传入控制参数,数据库无法对UDF函数进行串/并行执行的判断。
2、不可并行的UDF函数:首先UDF函数是一个非确定性函数,即使UDF传入相同的参数,此UDF函数也会获得不同的值,其次这个UDF函数对一组数据集合操作得到的结果集还和UDF函数对这组数据集合的调用次序有关。(例如sequence,如果进行并行操作,则会得到如下结果)。
3、gbased对所有UDF函数默认并行执行: 当gbase_parallel_execution这个并行开关开启后,gbased 对所有UDF函数的默认执行模式也是并行的。在此情况下,如果用户需要串行执行UDF函数,需要自行更改UDF代码,在UDF_INIT时,传给gbased串行执行的配置参数。参照下面的例子。
以下是控制UDF串行执行的模板示例:
//用户必须提供my_bool func_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
my_bool func_init (UDF_INIT *initid ,UDF_ARGS *args ,char *message )
{
initid->extension = malloc(sizeof(“no_parallel”));
memcpy(initid->extension,“no_parallel”,sizeof(“no_parallel”)); //no_parallel代表UDF函数串 串行执行
}
//用户需要提供void func_deinit(UDF_INIT *initid)
void fullToHalf_utf8_deinit(UDF_INIT *initid)
{
free(initid->extension);
return;
}