Показать ход выполнения очень длинной процедуры postgres (передать данные из транзакции до ее завершения) - PullRequest
1 голос
/ 25 января 2012

Я пытался создать таблицы, но это было бесполезно, потому что каждый начальный блок заключен в транзакцию в postgres, поэтому я не вижу никаких изменений до конца транзакции.Единственное решение - повышение информации, я использую его, чтобы показать текущий шаг процедуры, но это не совсем то, что я ищу.Мне нужно знать подробные данные текущих расчетов, потому что каждый шаг может занять несколько часов.Пожалуйста, предложите мне способ передачи данных из транзакции, прежде чем она закончится.

UPD: я нашел способ передачи прогресса: я могу увеличивать последовательности внутри моей процедуры и читать их из другого соединения.http://blog.endpoint.com/2010/04/viewing-postgres-function-progress-from.html

1 Ответ

2 голосов
/ 25 января 2012

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

Быстрая демонстрация:

CREATE EXTENSION dblink; -- or run the script from contrib before version 9.1

select * from dblink('dbname=steve', $$
       select datname, procpid, current_query from pg_stat_activity
      $$) r(datname name, pid int, current_query text);

производит:

 datname | pid  |                            current_query                            
---------+------+---------------------------------------------------------------------
 steve   | 8535 | select * from dblink('dbname=steve', $$                            +
         |      |        select datname, procpid, current_query from pg_stat_activity+
         |      |       $$) r(datname name,                                          +
         |      |           pid int, current_query text);
 steve   | 9235 |                                                                    +
         |      |        select datname, procpid, current_query from pg_stat_activity+
         |      |       

так что вы можете видеть, что это две отдельные сессии. dblink предоставляет функциональность для открытия постоянного соединения и т. д., которое это простое использование пропускает. При условии, что у вас уже есть схема для размещения информации о ходе выполнения, вы можете просто вызвать dblink (), чтобы заполнить / обновить ее через второе соединение, пока ваше первое соединение продолжает выполнять свою длинную транзакцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...