Я делаю ETL для файлов журнала в базе данных PostgreSQL и хочу узнать больше о различных подходах, используемых для оптимизации производительности загрузки данных в простую звездную схему.SQL - Оптимизация производительности объемных вставок и больших объединений?
Чтобы поставить вопрос в контексте, вот краткий обзор того, что я делаю в данный момент:
- отбросьте все внешние ключ и уникальные ограничения
- Импорт данных (~ 100 млн записей)
- Re -создайте ограничения и запустите анализ в таблице фактов.
Импорт данных осуществляется путем загрузки из файлов. Для каждого файла:
1) загружать данные из во временную таблицу с помощью COPY (инструмент массовой загрузки PostgreSQL)
2) Обновление каждой из таблиц 9 измерений с любыми новыми данными с использованием вставки для каждого такого как:
INSERT INTO host (name)
SELECT DISTINCT host_name FROM temp_table
EXCEPT
SELECT name FROM host;
ANALYZE host;
Анализа запускается в конце пластины с идеей сохранения статистики в актуальном состоянии в течение десятков миллионов обновлений (является ли это целесообразно или необходимо как минимум это не делает? похоже, значительно снижают производительность).
3) Тот факт, таблица обновляется с нечестивой 9-присоединиться:
INSERT INTO event (time, status, fk_host, fk_etype, ...)
SELECT t.time, t.status, host.id, etype.id ...
FROM temp_table as t
JOIN host ON t.host_name = host.name
JOIN url ON t.etype = etype.name
... and 7 more joins, one for each dimension table
Существуют ли более эффективные подходы, я с видом?
Я согласен в принципе, но когда я пробовал этот подход, я обнаружил, что он в среднем на 50% медленнее. Это похоже на кэширование таблиц измерений в сочетании с выполнением всего, поскольку массовые операции (а не отдельные выборки/вставки) выполняются быстрее. – Rob
@ Rob: Это интересно, поскольку это подход, который работал для меня в прошлом. Кстати, я не могу поверить, что этот ответ был ниспослан без каких-либо комментариев! – Adamski