Postgresql Update Query зависает - но завершится, если я добавлю 1-минутную паузу - PullRequest
0 голосов
/ 11 октября 2019

У меня есть работа 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...