Как импортировать * огромные * куски данных в PostgreSQL? - PullRequest
10 голосов
/ 09 августа 2010

У меня есть структура данных, которая выглядит следующим образом:

Model Place
    primary key "id"

    foreign key "parent" -> Place
    foreign key "neighbor" -> Place (symmetryc)
    foreign key "belongtos" -> Place (asymmetric)

    a bunch of scalar fields ...

У меня более 5 миллионов строк в таблице модели, и мне нужно вставить ~ 50 миллионов строк в каждую из двух таблиц внешнего ключа. У меня есть SQL файлы, которые выглядят так:

INSERT INTO place_belongtos (from_place_id, to_place_id) VALUES (123, 456);

и они около 7 Гб каждый. Проблема в том, что когда я выполняю psql < belongtos.sql, мне требуется около 12 часов , чтобы импортировать ~ 4 миллиона строк на моем процессоре AMD Turion64x2. ОС Gentoo ~ amd64, PostgreSQL версии 8.4, скомпилирована локально. Каталог данных - это монтируемое устройство, расположенное на моем втором расширенном разделе (ext4), которое, я считаю, не является узким местом.

Я подозреваю, что вставка отношений внешнего ключа занимает очень много времени, потому что psql проверяет наличие ключевых ограничений для каждой строки, что, вероятно, добавляет некоторые ненужные издержки, поскольку я точно знаю, что данные действительны. Есть ли способ ускорить импорт, то есть временно отключить проверку ограничений?

Ответы [ 2 ]

16 голосов
/ 09 августа 2010
  1. Убедитесь, что оба ограничения внешнего ключа ЗАДЕРЖКА
  2. Используйте COPY для загрузки ваших данных
  3. Если вы не можете использовать COPY, используйте подготовленный оператор для своей ВСТАВКИ.
  4. Настройки конфигурации Propper также помогут, проверьте настройки WAL .
0 голосов
/ 09 августа 2010

Ответ - да ... Депес написал здесь статью об отложенной уникальности .к сожалению, это похоже на функцию 9.0.

хмм ... Может быть, эта статья не относится к вашей ситуации?Кажется, мы смогли установить ограничения на отложенное на некоторое время ... Я предполагаю, что уникальная ситуация уникальна (каламбур).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...