Лучший способ отследить прогресс длительной работы функции (извне) - PostgreSQL 11? - PullRequest
1 голос
/ 08 мая 2019

Каков наилучший способ отследить ход выполнения длительно выполняющейся функции в PostgreSQL 11?

Поскольку каждая функция выполняется в одной транзакции, даже если функция записывает в какую-либо таблицу «log» никакой другой сеанс/ транзакция может видеть этот вывод, если функция не завершается с SUCCESS.

Я читал о некоторых попытках здесь, но они относятся к 2010 году.

https://www.endpoint.com/blog/2010/04/28/viewing-postgres-function-progress-from

Кроме того, этот подход выглядит крайне неудобным.

На сегодняшний деньКаков наилучший способ отслеживать прогресс?

Один из известных мне подходов состоит в том, чтобы превратить функцию в процедуру, а затем выполнить частичные коммиты в SP.Но что, если я хочу вернуть какой-то набор результатов из функции ... В этом случае я не могу превратить его в SP, верно?Итак ... как поступить в таком случае?

Заранее большое спасибо.

ПРИМЕЧАНИЕ. Функция написана на PL / pgSQL, самом распространенном процедурном языке SQL, доступном в PostgreSQL.

1 Ответ

2 голосов
/ 08 мая 2019

Я не знаю, что есть отличный способ сделать это встроенным в postgres, но есть несколько способов добиться регистрации, которая будет видна вне функции.

  1. Вы можете использовать расширение pg_background для запуска вставки в фоновом режиме, которая будет видна за пределами функции. Это требует компиляции и установки этого расширения.
  2. Используйте dblink для подключения к той же базе данных и вставки данных. Скорее всего, это потребует настройки некоторых разрешений.

Ни один из этих вариантов не идеален, но, надеюсь, он вам подойдет. Преобразование вашей функции в процедуру также может работать, но вы не сможете вызвать процедуру из транзакции.

...