Я хочу, чтобы эта хранимая процедура работала одновременно, но, как я вижу в PgAdmin, это не так. Один процесс блокируется другим (ждет его завершения). По-моему, у обновления не возникает проблем с одновременным запуском. Так что это все о INSERT, я прав? Я попытался установить ROW SHARE EXCLUSIVE LOCK на запрос обновления, но я зашел в тупик.Сохраненная процедура не является параллельной
UPDATE product p SET category_id = m.internal_category_id, category_from=m.cat_prior FROM main_table m
WHERE p.mpn=m.mpn AND
p.vendor_id = m.internal_vendor_id AND
m.new_prod=false and
m.internal_category_id IS NOT NULL AND
(category_from is null or category_from<=m.cat_prior);
INSERT INTO product(vendor_id, category_id, mpn, name, category_from)
SELECT DISTINCT ON(m.mpn, m.internal_vendor_id) m.internal_vendor_id, m.internal_category_id, m.mpn, m.prod_name, m.cat_prior
FROM main_table m
LEFT OUTER JOIN product ON product.mpn=m.mpn AND product.vendor_id=m.internal_vendor_id
WHERE m.new_prod='1' AND m.internal_vendor_id IS NOT NULL
AND product.mpn IS NULL;
UPDATE main_table m SET internal_product_id = p.id
FROM product p
WHERE p.mpn=m.mpn AND p.vendor_id = m.internal_vendor_id ;
UPDATE vendor SET has_products = true FROM (SELECT DISTINCT v.id as id FROM vendor v INNER JOIN product p ON p.vendor_id = v.id) AS r WHERE vendor.id = r.id;
UPDATE vendor SET has_products = false FROM (SELECT DISTINCT v.id as id FROM vendor v LEFT JOIN product p ON p.vendor_id = v.id WHERE p.vendor_id IS NULL) AS r WHERE vendor.id = r.id;