оптимизировать массив массивов сумм объектов по ключу postgresql - PullRequest
1 голос
/ 05 мая 2020

Мне нужна функция postgresql, которая объединяет и суммирует (по ключу) 4 массива объектов jsonb. Каждый jsonb может иметь 0 или несколько объектов:

parameter 1: [ {"a": 1.0}, {"b": 2.5} ]
parameter 2: [ {"a": 1.0} ]
parameter 3: [ {"a": 1.0}, {"c": 2.5} ]
parameter 4: [ {"a": 1.0}, {"b": 2.5} ]

, и ожидается следующий результат:

[{"a": 4.0}, {"b": 5}, {"c": 2.5}]

У меня есть функция, которая действительно это делает. Но производительность у него очень плохая. Мне нужно вызывать его для каждой строки. На данный момент с 1,4 миллионами строк разница при добавлении вызова функции составляет от 39 se c до 2 min 30 se c. мы ожидаем получить более 50 миллионов результатов, и это будет примерно 1 час 40 минут.

Я действительно новичок в postgresql, и это лучшая функция, которую я могу сделать. Я не знаю, есть ли более эффективный способ сделать это.

это моя настоящая функция

create or replace function join_and_sum(parameter1 jsonb, parameter2 jsonb, parameter3 jsonb, parameter4 jsonb) returns jsonb
    language plpgsql
as
$$
DECLARE
    column_jsonb            jsonb;
BEGIN

    select into column_jsonb jsonb_agg(p.jsonb_build_object)
    from (
             SELECT jsonb_build_object(key, SUM(value::float))
             FROM (
                      SELECT (JSONB_EACH_TEXT(j)).*
                      from jsonb_array_elements( parameter1 || parameter2 || parameter3 || parameter4) j
                  ) j
             group by j.key
         ) p;

    RETURN column_jsonb;

END;
$$;

заранее спасибо

...