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

标签 sql arrays performance postgresql madlib

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

我找到了可以帮助我从 this related answer 中取消嵌套的代码.然而,在这个非常大的二维数组(150,000+ 1d float 组)上,代码速度非常慢。虽然 unnest() 只需要几秒钟就可以运行,但即使等待了几分钟,代码也没有完成。

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

ERROR: Function "deconstruct_2d_array(double precision[])": Invalid type conversion. Internal composite type has more elements than backend composite type.

最佳答案

您在我的旧答案中找到的函数不适用于大数组。我从来没有想过像你这样大的数组,它可能应该是一个集合(一个表)。

尽管如此,这个 PL/pgSQL 函数可以替代 referenced answer 中的函数.需要 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$;

快 40 倍 在我对 Postgres 9.6 中的大型二维数组的测试中。

STRICT 以避免 NULL 输入异常(如 commented by IamIC ):

ERROR: FOREACH expression must not be null

关于sql - 如何在 PostgreSQL 中快速将二维数组嵌套到一维数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41402399/

相关文章:

php - 为超过 350,000 名用户计算 "ranks"的有效方法

mysql - 我如何进行此选择查询

php - MySQL在不匹配时显示空记录

sql - 如何在 group by 子句中按日期获取最新项目

javascript - JS/ES6 : Check if every array element has a child in another array

c++ - 加速递归行列式算法

sql - TRUNC 结果为 0 位小数的错误值

java - Java 中二维数组/矩阵的扩展大小

python - 使用 `numpy.digitize` 分割 NumPy 数组后如何计算每个 bin 的平均值?

python - 与 Python 代码相比,我如何提高 Rust 代码的性能?