Массовая вставка Postgres в разные схемы

#postgresql

#postgresql

Вопрос:

В настоящее время мы храним данные в Redis для временной агрегации и имеем worker, который выполняет массовую вставку в Postgres. Есть ли способ, которым мы можем выполнить массовую вставку в несколько схем за одну транзакцию вставки? Это избавит от необходимости агрегировать данные в Redis. Или есть лучший способ агрегировать запросы?

Заранее спасибо за помощь.

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

1. Я полагаю, вы могли бы настроить таблицу с триггером ВСТАВКИ и заставить логику вашей триггерной функции определять, в какую таблицу записывать, а затем просто КОПИРОВАТЬ в эту таблицу. Это не то, что я пробовал раньше или сравнивал, но я ожидаю, что это будет медленнее, чем просто одна вставка в целевую таблицу.

2. Какой должна быть «транзакция одиночной вставки»? Одна транзакция — конечно, без проблем. Одиночная ВСТАВКА — в принципе, это невозможно, ВСТАВЛЯЙТЕ вставки в единственную таблицу. Возможен обходной путь с помощью правил, триггеров или разделения… Пожалуйста, задайте правильный вопрос с подробностями.

3. Я бы предложил другой подход. Предоставьте Postgres доступ к ресурсам Redis в виде внешних таблиц с помощью redis_fdw ( pgxn.org/dist/redis_fdw ). Запланируйте задание Postgres SQL, которое запрашивает таблицы Redis и вставляет в схемы / таблицы Postgres. Вы можете сделать это за одну транзакцию в виде анонимного блока PL / pgSQL do .

Ответ №1:

Это действительно зависит от того, что вы подразумеваете под «транзакцией одиночной вставки».

Один-единственный INSERT оператор может повлиять только на одну конкретную таблицу. Однако вы все равно могли бы BEGIN выполнить транзакцию (зависит от реализации), выполнить все свои INSERT действия там, а затем COMMIT выполнить транзакцию. Это все равно было бы более эффективным, чем выполнение всех INSERT операций во многих транзакциях, поскольку это позволяет избежать избыточных «рукопожатий».

https://www.postgresql.org/docs/current/sql-begin.html

Ответ №2:

Вы пробовали создавать обновляемое представление, которое ссылается на две таблицы, а затем массово вставлять в это представление?

Ответ №3:

Вы ищете что-то подобное?

 with data (c1, c2) as (
  values (1,2),(10,20),(30,40)
), s1_insert as (
  insert into schema_one.table_1(c1, c2)
  select c1, c2
  from data
)
insert into schema_two.table_2(col1, col2)
select c1, c2
from data;
  

Ответ №4:

Если вы выполните инструкцию insert, произойдет одна транзакция, и вы сможете вставить только в одну таблицу (поэтому вставка по нескольким схемам вообще невозможна в одной транзакции).

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

1. Это должно быть » невозможно в одном заявлении » — абсолютно возможно иметь одну транзакцию, которая вставляет в таблицы в разных схемах.