Моя цель — эффективно импортировать большие объемы данных в базу данных Postgres. В принципе, необработанные данные можно сжать примерно в 20 раз (например, с помощью gzip).
Оператор COPY
кажется лучшим вариантом для массового импорта.
Помимо sslcompression (которое применяется после шифрования данных), существует ли способ сжатия фактических данных (контента), передаваемых между клиентом и сервером, или он даже встроен по умолчанию?
Большое спасибо.
(Не имеет значения, но я использую golang).
COPY [TO|FROM] PROGRAM
позволяет использовать gzip как программу, если она установлена в доступном для процесса сервера postgres месте: https://www.postgresql.org/docs/current/sql-copy.html#id-1.9.3.55. 10.
Вы также можете использовать COPY TO|FROM STDIN
и выполнить распаковку/сжатие на стороне клиента.
Синопсис предполагает, что PROGRAM 'command'
и STDIN
можно использовать только исключительно. Насколько я понимаю, это означает, что я НЕ МОГУ читать сжатые данные из STDIN
, передавать их через программу gzip и оттуда в таблицу. Сжатые данные должны присутствовать на сервере. Правильный?
только программы, которые будут выполняться PROGRAM
, должны присутствовать на сервере. Вы можете использовать copy from program 'curl SOME_URL.zip | gunzip'
или что-то в этом роде
да PROGRAM
также передает вывод на стандартный ввод, что подразумевает стандартный ввод. И действительно, postgres не понимает содержимое gzip, его нужно передавать в несжатом виде (будь то текстовое или двоичное), но вы можете сделать распаковку в непосредственной близости от серверного процесса с помощью copy from program
, что может быть лучше, чем отправлять его в распакованном виде с клиента.
Если вашим узким местом является пропускная способность сети, вы захотите отправить (скопировать или передать) сжатые данные на компьютер с базой данных, используя что-то вроде scp или ssh, а затем запустить COPY в клиенте на том же компьютере, где работает сервер базы данных. Есть несколько способов организовать это, но все они имеют что-то отличное от libpq/PostgreSQL в качестве дирижера оркестра.
Данные должны быть распакованы, прежде чем сервер сможет их использовать, при условии, что вы не храните данные в двоичной форме в сжатом состоянии. Для меня решением было бы сжать данные на клиентской машине, передать их на серверную машину, а затем распаковать для загрузки на сервер.