Самый эффективный способ массовой загрузки ненормализованного набора данных в PostgreSQL?

Я загрузил огромный набор данных CSV — отфильтрованные данные об использовании Eclipse, используя COPY PostgreSQL, и это занимает огромное количество места, потому что оно не нормализовано: три столбца TEXT гораздо эффективнее реорганизованы в отдельные таблицы, на которые можно ссылаться из основной таблицы со столбцами внешнего ключа.

У меня вопрос: быстрее ли рефакторить базу данных после загрузки всех данных или создать нужные таблицы со всеми ограничениями, а затем загрузить данные? Первый включает в себя многократное сканирование огромной таблицы (около 10 ^ 9 строк), в то время как второй будет включать выполнение нескольких запросов для каждой строки CSV (например, был ли этот тип действия замечен ранее? Если нет, добавьте его в таблицу действий, получите его ID, создайте строку в основной таблице с правильным ID действия и т. д.).

Прямо сейчас каждый шаг рефакторинга занимает примерно день или около того, и начальная загрузка также занимает примерно столько же времени.


person michel-slm    schedule 26.10.2010    source источник


Ответы (1)


Исходя из моего опыта, вы хотите получить все данные, которые вам нужны, в промежуточную таблицу в базе данных и перейти оттуда, после чего выполнить столько логики на основе набора, сколько сможете, скорее всего, с помощью хранимых процедур. Когда вы загружаетесь в промежуточную таблицу, в таблице нет индексов. Создайте индексы после загрузки данных в таблицу.

По этой ссылке можно найти несколько советов http://www.postgresql.org/docs/9.0/interactive/populate.html

person Kuberchaun    schedule 26.10.2010
comment
Спасибо, Старшип. Я просматривал документацию pgsql, но еще не наткнулся на эту страницу. - person michel-slm; 27.10.2010
comment
Я загрузил данные с помощью COPY до того, как были добавлены какие-либо ограничения индекса и внешнего ключа, поэтому здесь нет проблем. Медленные шаги, о которых я говорил, включают нормализацию таблицы. Я так понимаю, этого не избежать... ну ладно. - person michel-slm; 27.10.2010
comment
@ michel-slm Полезно для меня: создание промежуточной таблицы и INSERT INTO table_name (...) SELECT ... с разделением значений на строки с помощью этого: stackoverflow.com/questions/29419993/ - person mkczyk; 28.02.2019