Разделите ваши входные данные на отдельные файлы вне базы данных и загрузите каждый из них, используя COPY, вместо того, чтобы полагаться на правило для их распространения. Если правило, которое вы даете, является любым примером, это тривиальное преобразование текста для применения. Кроме того, разделение на передний план позволит вам загружать разделенные файлы параллельно, если ваша дисковая система настроена на это.
Серьезно, не полагайтесь на правило, чтобы сделать это распределение для массовой загрузки. Практически всегда так бывает, что для массовой и транзакционной нагрузки требуются разные подходы, если только вы не готовы грубо насиловать один или другой (и обычно ждать).
Например, ваше правило использует date_part () для извлечения месяца из даты, поэтому для определения дочерней таблицы postgres должен проанализировать строку даты, преобразовать ее в метку времени, а затем преобразовать метку времени обратно в календарь, чтобы снова вернуть поле месяца. Но если вы пишете что-то, чтобы сделать это заранее, вы можете просто сделать substr($date,5,2)
(или эквивалент): что, по вашему мнению, будет быстрее?
Это также возможность очистить формат данных, чтобы COPY приняла его. Обратите внимание, что вы можете указать столбцы с помощью команды COPY: если вы не сделали этого с этой схемой и файлом примера, вы получите ошибки из-за дополнительного столбца «id» на передней панели. («copy from ... with csv header», возможно, понял это, но, возможно, нет… опция «header» может просто пропустить первую строку).
Я только что загрузил около 280e6 строк в экземпляр postgresql сам за несколько часов, так что это, конечно, не невозможно. Для этой начальной загрузки я выключил fsync =; План состоит в том, чтобы загрузить резерв, а затем снова включить его для регулярных ежедневных нагрузок. Мне пришлось установить checkpoint_segments = 40, чтобы избежать получения предупреждений о контрольных точках в журналах. Это просто загружается на мой компьютер разработчика - я использую выделенный диск для базы данных, который отличается от диска, используемого для xlogs (то есть я создал табличное пространство на большом диске и создал базу данных внутри этого табличного пространства). В экземпляре для shared_buffers установлено значение 1 ГБ, а для checkpoint_target установлено значение 0.5. Я попытался загрузить некоторые разделы параллельно, и это не дало особых улучшений, поэтому я подозреваю, что медленный диск является узким местом, а не самой БД.
Осталось еще 1.7e9 строк ... Надеюсь, завтра закончим.