Как реализовать параллелизм в Postgres - PullRequest
0 голосов
/ 25 октября 2018

Я работаю над функционалом обновления журналов партии на основе ключа клиента и других условий запроса.

В своей функциональности я использую объединение и циклический просмотр записей по одной, последовательно обновляя журнал партии..

Мой код ниже

CREATE TABLE linen_tenant_header
(
    tenant_key character varying(200) NOT NULL,
    tenant_name character varying(50) NOT NULL,
    email character varying(50) NOT NULL,
    created_user character varying(200) NOT NULL,
    updated_user character varying(200),
    created_time timestamp without time zone DEFAULT now(),
    updated_time timestamp without time zone DEFAULT now()
);

CREATE TABLE linen_sc_batch_log
    (
    batch_id serial NOT NULL,
    profile_header_id integer NOT NULL,
    batch_status character varying(200),
    batch_type character varying(200) NOT NULL,
    batch_mode character varying(200) NOT NULL,
    tenant_key character varying(200) NOT NULL,
    created_user character varying(200),
    updated_user character varying(200),
    created_time timestamp without time zone DEFAULT now(),
    updated_time timestamp without time zone DEFAULT now(),
);

CREATE TABLE linen_sc_expressions
(
    expression_id integer NOT NULL,
    reference_id integer NOT NULL,
    tenant_key character varying(200) NOT NULL,
    expression_text character varying(10000) NOT NULL,
    start_date date NOT NULL,
    end_date date,
    created_user character varying(200) NOT NULL,
    updated_user character varying(200),
    created_time timestamp without time zone DEFAULT now(),
    updated_time timestamp without time zone DEFAULT now()
);

CREATE OR REPLACE FUNCTION sample_function(
    tenant_key TEXT
) RETURNS VOID AS $$
DECLARE
    rec RECORD;
BEGIN
    FOR rec IN SELECT * FROM linen_sc_batch_log bl, linen_sc_expressions sce  where bl.profile_header_id = sce.reference_id and bl.tenant_key = $1 and sce.tenant_key = $1
    LOOP
        EXECUTE FORMAT('UPDATE linen_sc_batch_log set batch_status = %L where tenant_key = %L and batch_id = %L::INTEGER', 'EXTRACTED', tenant_key, rec.batch_id);
    END LOOP;
END;
$$ LANGUAGE plpgsql;

Моя функциональность работает правильно, но мне нужно улучшить свою функциональность, добавив параллелизм.

Вместо того, чтобы перебирать все записи,Я хочу одновременно обновлять все записи одновременно.

Я исследовал статьи в Google и PostgreSQL, но не нашел связанного понятия.

1 Ответ

0 голосов
/ 25 октября 2018

Я думаю, что это можно сделать одним оператором SQL:

UPDATE linen_sc_batch_log AS bl
SET batch_status = 'EXTRACTED'
FROM linen_sc_expressions AS sce
WHERE bl.profile_header_id = sce.reference_id
  AND bl.tenant_key = $1 AND sce.tenant_key = $1;

Если вы хотите, чтобы это распараллелилось, вы можете запустить несколько таких обновлений при одновременном соединении с базой данных, добавив к каждому из них пункт типа AND id % 10 = <em>n</em>,

...