Это нормально для функции, чтобы получить блокировку уровня базы данных, которая предотвращает автоматическую очистку и создание индекса для совершенно не связанных таблиц?
У меня есть долговременная хранимая процедура, которая читает из одной таблицы и записывает данные SUM()
/ AVG()
в другую таблицу. Во время выполнения сценария (который может занять почти час в больших системах), автоматическая очистка останавливает и пытается выполнить такие действия, как создание индексов (CREATE UNIQUE INDEX CONCURRENTLY
) для несвязанных таблиц до блок . Как только хранимая процедура завершается, заблокированные процессы завершаются.
Думая, что что-то в хранимой процедуре неправильно блокировало некоторый ресурс, я переписал это буквально просто как сон:
CREATE OR REPLACE FUNCTION summarize_day(p_agg_date date)
RETURNS int AS
$$
BEGIN
SELECT pg_sleep(120);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
Даже эта сохраненная процедура «ничего не делать» предотвращала автоматическую очистку и другие операции с базой данных.
Есть ли способ закодировать его, чтобы НЕ блокировать базу данных для других операций во время выполнения этой длительной процедуры?