簡體   English   中英

如何在PostgreSQL中將2d數組快速嵌套到1d數組中?

[英]How to unnest a 2d array into a 1d array quickly in PostgreSQL?

我有一個非常大的數組,可以使用Apache Madlib計算得出,我想對該2d數組中的每個單個數組應用一個運算。

我已經找到了可以幫助我從相關答案中解脫出來的代碼。 但是,在這個非常大的2d數組(150,000 + 1d float數組)上,代碼的速度非常慢。 盡管unnest()只需花費幾秒鍾即可運行,即使等待了幾分鍾后代碼仍未完成。

當然,必須有一種更快的方法將大型2d陣列嵌套成較小的1d陣列? 如果該解決方案使用Apache Madlib,則有加分。 我確實在文檔deconstruct_2d_array發現了一根引線,但是,當我嘗試在矩陣上調用該函數時,它失敗並出現以下錯誤:

錯誤:函數“ deconstruct_2d_array(double precision [])”:無效的類型轉換。 內部復合類型比后端復合類型具有更多的元素。

您在舊答案中找到的功能不適用於大型陣列。 我從沒想過數組的大小,它可能應該是一個集合(一個表)。

盡可能地,此plpgsql函數替換了所引用的答案中的一個。 需要Postgres 9.1或更高版本。

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

我在Postgres 9.6的大型2D陣列上進行測試的速度提高了40倍。

STRICT避免NULL輸入發生異常(如IamIC所述 ):

錯誤:FOREACH表達式不能為空

現在有一個內置的MADlib函數可以執行此操作-array_unnest_2d_to_1d,此函數在1.11版本中引入: http ://madlib.incubator.apache.org/docs/latest/array__ops_8sql__in.html#af057b589f2a2cb1095caa99feaeb3d70

這是一個示例用法:

CREATE TABLE test1 (pid int, points double precision[]);
INSERT INTO test1 VALUES
(100,  '{{1.0, 2.0, 3.0}, {4.0, 5.0, 6.0}, {7.0, 8.0, 9.0}}'),
(101,  '{{11.0, 12.0, 13.0}, {14.0, 15.0, 16.0}, {17.0, 18.0, 19.0}}'),
(102,  '{{21.0, 22.0, 23.0}, {24.0, 25.0, 26.0}, {27.0, 28.0, 29.0}}');
SELECT * FROM test1;

產生

 pid |               points               
-----+------------------------------------
 100 | {{1,2,3},{4,5,6},{7,8,9}}
 101 | {{11,12,13},{14,15,16},{17,18,19}}
 102 | {{21,22,23},{24,25,26},{27,28,29}}
(3 rows)

然后調用unnest函數:

SELECT pid, (madlib.array_unnest_2d_to_1d(points)).* 
FROM test1 ORDER BY pid, unnest_row_id;

產生

pid | unnest_row_id | unnest_result 
-----+---------------+---------------
 100 |             1 | {1,2,3}
 100 |             2 | {4,5,6}
 100 |             3 | {7,8,9}
 101 |             1 | {11,12,13}
 101 |             2 | {14,15,16}
 101 |             3 | {17,18,19}
 102 |             1 | {21,22,23}
 102 |             2 | {24,25,26}
 102 |             3 | {27,28,29}
(9 rows)

其中,unnest_row_id是2D數組的索引

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM