массовые / множественные запросы, которые занимают много времени, никогда не завершаются в Postgres

#postgresql #long-integer

#postgresql #длинное целое

Вопрос:

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

Пример: в pgAdmin я открываю окно sql-запроса и набираю

 select customfunction('string1');
select customfunction('string2');
           ^
           .
           .
           .
           .
           v
select customfunction('string100000000');
  

Когда я пытаюсь запустить это, это работает только тогда, когда я запускаю около 6000 строк (6000 функций). Если я отменяю его во время выполнения, он ничего не фиксирует (даже первую строку). Я должен продолжать разделять их на пакеты, чтобы выполнить весь запрос. Как я могу добиться этого, не запуская их пакетно.

Я хочу скопировать и вставить весь запрос и подождать, пока все не будет сделано. Прямо сейчас запрос просто выполняется без ответа бесконечно, если я выполняю более 10000 строк в пакете. Есть ли способ, которым postgres может фиксировать каждую строку после ее запуска?

Я также хотел бы знать, может ли кто-нибудь точно определить, какая строка обрабатывается во время выполнения запроса.

Ответ №1:

Есть ли способ, которым postgres может фиксировать каждую строку после ее запуска?

Этого не произойдет, если включена автоматическая фиксация — это тоже по умолчанию, так что… Вы предваряете вызовы инструкцией begin? Если это так, зафиксируйте перед выполнением ваших вызовов…

Также рассмотрите возможность подготовки инструкции или выполнения того, что предложил Джек.

Комментарии:

1. я не понимаю. как бы зафиксировать каждую строку в пакетном вызове?

2. выполните что-то вроде: begin; select ...; commit;

Ответ №2:

Пробовали ли вы пакетную обработку ваших строк в file, импортировать файл в таблицу (которую я буду называть string_table с одним столбцом, называемым string) и пытаться:

 select customfunction(string)
from string_table;
  

ETA: Если вам нужен какой-то индикатор выполнения и вам нужно запускать по одному выбору за раз, вы могли бы использовать DBI на языке сценариев для чтения строк из файла или таблицы, выполнять итерации по вызовам функций в цикле, а затем выполнять простую консольную распечатку с каждой итерацией.