如何在 PostgreSQL 中快速将二维数组取消嵌套到一维数组中?

Sky*_*ion 3 sql arrays postgresql performance madlib

我有一个非常大的数组,我使用 Apache Madlib 进行了计算,我想对该二维数组中的每个数组应用一个操作。

我找到了可以帮助我从这个相关答案中解除它的代码。然而,在这个非常大的 2d 数组(150,000+ 1d float 数组)上,代码非常慢。虽然unnest()只需要几秒钟的时间来运行,但即使等待了几分钟,代码也还没有完成。

当然,必须有一种更快的方法将大型二维数组解除嵌套到较小的一维数组中?如果该解决方案使用 Apache Madlib,则加分。我确实在名为 的文档中找到了一条线索deconstruct_2d_array,但是,当我尝试在矩阵上调用该函数时,它失败并出现以下错误:

错误:函数“deconstruct_2d_array(double precision[])”:无效的类型转换。内部复合类型比后端复合类型有更多的元素。

Erw*_*ter 6

您在我的旧答案中找到的函数对于大数组来说不能很好地扩展。我从来没有想过你的数组大小,它可能应该是一个集合(一个表)。

尽管如此,这个 PL/pgSQL 函数可以替换引用答案中的函数。需要 Postgres 9.1 或更高版本。

CREATE OR REPLACE FUNCTION unnest_2d_1d(ANYARRAY, OUT a ANYARRAY)
  RETURNS SETOF ANYARRAY
  LANGUAGE plpgsql IMMUTABLE STRICT AS
$func$
BEGIN
   FOREACH a SLICE 1 IN ARRAY $1 LOOP
      RETURN NEXT;
   END LOOP;
END
$func$;
Run Code Online (Sandbox Code Playgroud)

我在 Postgres 9.6 中对大型二维数组进行的测试中速度提高了 40 倍。

STRICT避免 NULL 输入异常(如IamIC 所评论):

错误:FOREACH 表达式不能为空