2015-05-12 4 views
1

Я хочу загрузить огромное количество данных в PostgreSQL. Знаете ли вы какие-либо другие «трюки», кроме тех, которые упомянуты в документации PostgreSQL?Каков наилучший способ загрузки огромного количества данных в PostgreSQL?

Что я сделал до сих пор?

1) установить следующие параметры в postgresql.conf (64 ГБ ОЗУ):

shared_buffers = 26GB 
    work_mem=40GB 
    maintenance_work_mem = 10GB  # min 1MB default: 16 MB 
    effective_cache_size = 48GB 
    max_wal_senders = 0  # max number of walsender processes 
    wal_level = minimal   # minimal, archive, or hot_standby 
    synchronous_commit = off # apply when your system only load data (if there are other updates from clients it can result in data loss!) 
    archive_mode = off  # allows archiving to be done 
    autovacuum = off   # Enable autovacuum subprocess? 'on' 
    checkpoint_segments = 256  # in logfile segments, min 1, 16MB each; default = 3; 256 = write every 4 GB 
    checkpoint_timeout = 30min   # range 30s-1h, default = 5min 
    checkpoint_completion_target = 0.9 # checkpoint target duration, 0.0 - 1.0 
    checkpoint_warning = 0    # 0 disables, default = 30s 

2) сделок (отключено) + автоматической фиксации установленного уровня изоляции (наименьший возможный: Многократное чтение) создать новую таблицу и загрузить в нее данные в той же транзакции.

3) установить COPY команды для выполнения одной транзакции (предположительно это самый быстрый подход к COPY данных)

5) отключен автовакууминг (не будет восстанавливаться статистические данные после того, как добавлены новые 50 строк)

6) FREEZE COPY FREEZE не ускоряет сам импорт, но быстрее выполняет операции после импорта.

Есть ли у вас какие-либо другие рекомендации или, возможно, вы не согласны с вышеупомянутыми настройками?

+1

Вы хотите, чтобы checkpoint_timeout запускал контрольно-пропускной пункт каждые 45 секунд? 30 минут (или что-то в этом роде) имеет больше смысла для меня. Но каково ваше определение «массивного объема данных»? –

+0

Теперь я загружаю данные размером от 1 до 100 ГБ. Возможно, вы правы, что в этом случае тайм-аут контрольной точки должен быть увеличен. Время загрузки занимает больше 30 минут, поэтому я попытаюсь увеличить тайм-аут контрольной точки. Спасибо. – ady

+1

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

ответ

1

Do NOTиндексы за исключением уникальной цифровой цифровой клавиши.

Это не соответствует всей теории БД, которую мы получили, но тестирование с большими нагрузками данных демонстрирует это. Вот результат 100M нагрузок за один раз, чтобы достичь 2 миллиардных рядов в таблице, и каждый раз, когда в результирующую таблицу входит множество различных запросов. Первый графический интерфейс с 10 гигабитным NAS (150 МБ/с), второй с 4 SSD в RAID 0 (R/W @ 2 ГБ/с).

Index use vs sequential - 150MB/s disks

Если у вас есть более чем 200 миллионов строк в таблице на обычных дисках, это быстрее, если вы забыли индексы. На SSD лимит составляет 1 миллиард.

Index use vs sequential - 2 GB/s SSD

Я сделал это и с перегородками для достижения лучших результатов, но с PG9.2 это трудно извлечь из них пользу, если вы используете хранимые процедуры. Вы также должны позаботиться о том, чтобы писать/читать только по одному разделу за раз. Однако перегородки - это способ пойти, чтобы ваши таблицы были ниже стены с 1 миллионом. Это также помогает много для многопроцессорных нагрузок. С помощью SSD один процесс позволяет мне вставить (скопировать) 18 000 строк/с (с некоторыми работами по обработке). При многопроцессорности на 6 процессорах он растет до 80 000 строк/с.

Следите за своим CPU & Использование IO во время тестирования для оптимизации обоих.

+0

Благодарим вас за ответ. Практическое правило говорит, что индексы должны создаваться после загрузки данных (особенно для первой загрузки). Если вы можете воссоздать свои индексы параллельно и загрузить более 5% существующих данных, обычно лучше отказаться от индексов перед загрузкой (включая индекс «уникальный ключ»). Вы даете результаты в строках/сек, но эта метрика специфична для ваших данных, было бы немного лучше сообщить результаты в формате MB/sec или GB/sec. Загрузка данных в формате CSV сильно зависит от ЦП, а влияние IO не так важно. – ady

+0

Как хранимые процедуры исключают загрузку с включенными разделами? – ady

+0

Что такое стена из 1 миллиарда строк? Кстати, таблицы в PostgreSQL хранятся в файлах по 1 Гбайт по умолчанию. Таким образом, вы загружаете данные и запускаете некоторые запросы одновременно? Каков физический размер ваших данных? Используете ли вы какой-либо бенчмарк (например, TPC-H или YCSB)? Это очень хорошо известный подход, чтобы использовать как можно больше параллелизма для загрузки данных. Дело в том, как эффективно использовать многие ядра, это не тривиальная проблема. – ady

Смежные вопросы