Запрос DBLink не завершается даже после завершения

У меня есть запрос Dblink Amazon RDS (Postgres), который выполняет INSERT со строками из кластера Amazon Redshift. Запрос завершается через 15-20 минут, если не больше, но я вижу, что все строки вставляются всего через несколько минут. Я запускаю эти запросы через DataGrip от JetBrains.

Некоторые другие аналогичные dblink в том же соединении прерываются, как ожидалось. Единственное отличие, которое я вижу, - это размер стола, который в первом случае больше.

Все эти запросы просто копируют всю таблицу. Примерно так:

insert into rds_table(
  select *
  from db_link('foreign_server',
    $REDSHIFT$
      select *
      from redshift_table
    $REDSHIFT$) as table_n(...)
);

Где «чужой сервер» - это мое подключение к Redshift. Я знаю, что запрос выполнен, потому что rds_table имеет такое же количество строк, как и redshift_table.

DataGrip показывает, что запрос все еще выполняется:  Снимок экрана DataGrip

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

Почему это происходит? Это проблема с DataGrip или с Postgres? Как я могу это исправить?

Есть ли другая лучшая альтернатива для переноса данных из Redshift в RDS?


person Francesco Ambrosini    schedule 17.10.2019    source источник
comment
Вы можете показать заявление? Как вы определяете, что настоящих вставок больше нет? С нетривиальным оператором вполне может случиться так, что потребуется много обработки, чтобы выяснить, что строк с результатами больше не будет.   -  person Laurenz Albe    schedule 17.10.2019
comment
Если вы уже видите новые строки, транзакция и, следовательно, функция уже должны быть завершены. Что заставляет вас думать, что вызов dblink все еще выполняется?   -  person Laurenz Albe    schedule 17.10.2019
comment
Я так думал, но я запускаю его на DataGrip, и он показывает, что он все еще работает. Мне нужно вручную завершить его, чтобы иметь возможность запускать что-то еще на той же консоли. Вы предполагаете, что это может быть просто ошибка DataGrip и мой запрос в порядке?   -  person Francesco Ambrosini    schedule 17.10.2019
comment
Это мой вопрос. Вы говорите, что это показывает, что он все еще работает. Как именно это показывает? Если вы не можете описать это словами, добавьте к вопросу снимок экрана.   -  person Laurenz Albe    schedule 17.10.2019
comment
Я добавил скриншот и еще несколько строк к вопросу   -  person Francesco Ambrosini    schedule 18.10.2019
comment
Привет! Я Макс из DataGrip. Если возможно, отправьте журналы SQL и журналы IDE (Справка - Показать журналы (SQL)) по адресу [email protected]   -  person moscas    schedule 18.10.2019


Ответы (1)


Если параллельная транзакция уже может видеть вставленные данные, это означает, что вставляющая транзакция и, следовательно, оператор INSERT уже должны быть завершены.

Если DataGrip показывает, что оператор все еще работает, значит, он вам лжет.

Так что это, должно быть, ошибка DataGrip.

person Laurenz Albe    schedule 18.10.2019