从确定性 SUDF 中选择多个输出参数的性能

Performance for selecting multiple out-params from deterministic SUDF

我即将测试 return 多个值的 SUDF 的确定性标志(跟进 的问题)。 DETERMINISTIC 标志应该缓存相同输入的结果以提高性能。但是,我不知道如何为多个 return 值执行此操作。我的 SUDF 如下所示:

CREATE FUNCTION DET_TEST(IN col BIGINT)
RETURNS a int, b int, c int, d int DETERMINISTIC
AS BEGIN
  a = 1;
  b = 2;
  c = 3;
  d = 4;
END;

现在,当我执行以下 select 语句时:

1) select DET_TEST(XL_ID).a from XL;
2) select DET_TEST(XL_ID).a, DET_TEST(XL_ID).b from XL;
3) select DET_TEST(XL_ID).a, DET_TEST(XL_ID).b,
          DET_TEST(XL_ID).c, DET_TEST(XL_ID).d from XL;

我得到对应的服务器处理时间:

1) Statement 'select DET_TEST(XL_ID).a from XL'
   successfully executed in 1.791 seconds  (server processing time: 1.671 seconds)
2) Statement 'select DET_TEST(XL_ID).a, DET_TEST(XL_ID).b from XL' 
   successfully executed in 2.415 seconds  (server processing time: 2.298 seconds)
3) Statement 'select DET_TEST(XL_ID).a, DET_TEST(XL_ID).b, DET_TEST(XL_ID).c, ...' 
   successfully executed in 4.884 seconds  (server processing time: 4.674 seconds)

如您所见,即使我使用相同的输入调用函数,处理时间也会增加。那么这是一个错误还是可能只有一个值存储在缓存中而不是整个 return 参数列表?

接下来我会试试MAP_MERGE。

我对您的场景进行了一些测试,可以确认响应时间随着从函数中检索到的每个附加结果参数的增加而显着增加。 DETERMINISTIC 标志在这里有所帮助,但不如人们希望的那么大,因为只保存了不同输入参数的结果值。 因此,如果将相同的值输入到函数中并且之前已使用这些值执行过,则结果将从缓存中获取。 但是,此缓存仅在 语句期间有效。这意味着:对于在单个语句中具有相同值的重复函数求值,DETERMINISTIC 函数可以跳过函数的求值并重用结果。

这并不意味着所有输出参数都被评估一次,然后可以重复使用。实际上,对于不同的输出参数,HANA 实际上必须执行不同的评估图。从这个意义上说,要求不同的参数比调用矩阵运算更接近于执行不同的功能。

所以,对于在另一个线程中使用 DETERMINISTIC 函数进行大规模改进的希望,我深表歉意。至少对于您的用例,这并没有多大帮助。

关于 MAP_MERGE 函数,重要的是要看到它确实有助于数据的水平分区,就像人们在例如经典的 map-reduce 情况。 您提供的用例实际上并没有这样做,而是试图为单个输入创建多个结果。

在我的测试过程中,我实际上发现只定义四个独立函数并在我的 SELECT 语句中针对我的源 table 调用它们会更快。

根据您喜欢进行的计算的复杂性和数据量,我可能会考虑使用适用于 SAP HANA 的 应用程序函数库 (AFL) SDK。有关详细信息,必须查看相关的 SAP 说明。