您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

映射合并运算符

描述

MAP_MERGE 运算符用于将输入表的每一行应用于映射器函数,并统一所有中间结果表。运算符的目的是用并行运算符替换连续的 FOR-loop 和 union 模式,如下例所示。

示例代码DO (OUT ret_tab TABLE(col_a nvarchar(200))=>?)BEGIN DECLARE i int; DECLARE varb nvarchar(200); t = SELECT * FROM tab; FOR i IN 1 .. record_count(:t) DO varb = :t.col_a[:i]; CALL mapper(:varb, out_tab); ret_tab = SELECT * FROM :out_tab UNION SELECT * FROM :ret_tab; END FOR;END; 备注映射程序是一个只读过程,只有一个输出是表格输出。

语法

 = MAP_MERGE(, 

(. [ {,

.} … ] [, ])

::= [{, } …] =

| | |

MAP_MERGE 运算符的第一个输入是映射器表 。映射程序表是要在其上按行进行迭代的表或表变量。在上述示例中,变量为表变量 t。

第二个输入是映射器函数 本身。映射器函数是您希望在映射程序表的每一行上都求值的函数 。目前,MAP_MERGE 运算符仅支持表函数 。这意味着在上述示例中,您需要将映射程序转换为表函数。

还必须将映射参数 . 作为映射器函数的输入传递。返回到上述示例,这将是变量 varb 的值。

示例

例如,让我们重写上述示例以利用 MAP_MERGE 运算符的并行执行。我们需要将过程转换为表函数,因为 MAP_MERGE 仅支持表函数

示例代码CREATE FUNCTION mapper (IN a nvarchar(200))RETURNS TABLE (col_a nvarchar(200))ASBEGIN ot = SELECT :a AS COL_A from dummy; RETURN :ot;END;

将映射程序转换为函数后,我们现在可以使用 MAP_MERGE 运算符替换整个 FOR 循环。

顺序 FOR-循环版本并行 MAP_Merge 运算符DO (OUT ret_tab TABLE(col_a nvarchar(200))=>?)BEGIN DECLARE i int; DECLARE varb nvarchar(200); t = SELECT * FROM tab; FOR i IN 1 .. record_count(:t) DO varb = :t.col_a[:i]; CALL mapper(:varb, out_tab); ret_tab = SELECT * FROM :out_tab UNION SELECT * FROM :ret_tab; END FOR;END;DO (OUT ret_tab TABLE(col_a nvarchar(200))=>?)BEGIN t = SELECT * FROM tab; ret_tab = MAP_MERGE(:t, mapper(:t.col_a));END; 