У меня есть работа ETL, которая состоит из 18 шагов. Он вставляет записи в несколько таблиц. Затем, ближе к концу задания, есть несколько запросов, которые добавляют дополнительные данные с помощью обновления. Изменение таблиц / индексов не производится.
Если я последовательно выполню запросы, задание будет зависать при первом запросе на обновление. Он вращается вечно и никогда не заканчивается. Если я поставлю 60-секундную паузу перед обновлением, то обновление завершится менее чем за 10 секунд.
Пока обновление «зависло», я запускаю
select pid, state, usename, query, query_start, NOW() - query_start AS duration
from pg_stat_activity
where pid in (
select pid from pg_locks l
join pg_class t on l.relation = t.oid
and t.relkind = 'r'
);
и вижу запрос на обновление.
Обратите внимание, что этот сервер postgre выполняет только одну эту задачу. Других пользователей нет.
Должно быть что-то происходит, чего я не вижу со вставками. Как я могу узнать, когда вставки завершены, чтобы мое обновление не зависало? Почему обновление не продолжается автоматически после завершения блокировки?
Вот обновление:
UPDATE warehouse.public.inv_sum_br_matl_by_month w
SET "Frozen YYYYMM" = m."Frozen YYYYMM"
FROM (
WITH frozen AS (
WITH materials AS (
SELECT r."Branch", r."SAP No"
FROM warehouse.public.inv_sum r
WHERE
r."Spcl Stk" IN ('', 'W')
AND r."YYYYMM" = '200908'
GROUP BY r."Branch", r."SAP No"
)
SELECT
m."Branch"
, m."SAP No"
, ms."X Matl Stat"
, bms."Br Matl Stat"
FROM materials m
LEFT JOIN warehouse.public.inv_sum_matl_by_month ms
ON
ms."SAP No" = m."SAP No"
AND ms."YYYYMM" = '200908'
LEFT JOIN warehouse.public.inv_sum_br_matl_by_month bms
ON
bms."Branch" = m."Branch"
AND bms."SAP No" = m."SAP No"
AND bms."YYYYMM" = '200908'
)
SELECT DISTINCT ON (f."Branch", f."SAP No", l."YYYYMM")
f."Branch"
, f."SAP No"
, CASE
WHEN f."X Matl Stat" = 'OB' THEN ''
WHEN f."X Matl Stat" NOT IN ('FR','ZF','ZM') AND f."Br Matl Stat" NOT IN ('FR','ZF','ZM') THEN ''
ELSE COALESCE(l."YYYYMM",'200908')
END AS "Frozen YYYYMM"
FROM frozen f
LEFT JOIN warehouse.public.inv_sum_br_matl_by_month l
ON
l."Branch" = f."Branch"
AND l."SAP No" = f."SAP No"
AND l."YYYYMM" < '200908'
ORDER BY f."Branch", f."SAP No", l."YYYYMM" DESC
) AS m
WHERE
w."Branch" = m."Branch"
AND w."SAP No" = m."SAP No"
AND w."YYYYMM" = '200908'
RETURNING 1
)
SELECT count(*) AS "RecCnt" FROM rows;