Я делаю ETL для файлов журналов в базе данных PostgreSQL и хочу узнать больше о различных подходах, используемых для оптимизации производительности загрузки данных в простую звездообразную схему.
Чтобы поставить вопрос в контексте, вот обзор того, что я делаю в настоящее время:
- Бросьте все внешние ключи и уникальные
ограничения
- Импорт данных (~ 100 миллионов записей)
- Повторно создайте ограничения и выполните анализ таблицы фактов.
Импорт данных осуществляется путем загрузки из файлов. Для каждого файла:
1) Загрузка данных из временной таблицы с помощью COPY (инструмент массовой загрузки PostgreSQL)
2) Обновите каждую из 9 таблиц измерений новыми данными, используя вставку для каждой, например:
INSERT INTO host (name)
SELECT DISTINCT host_name FROM temp_table
EXCEPT
SELECT name FROM host;
ANALYZE host;
Анализ выполняется в конце INSERT с целью поддержания статистики в актуальном состоянии в течение десятков миллионов обновлений (это целесообразно или необходимо? Как минимум, это, по-видимому, существенно не снижает производительность) .
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
Есть ли лучшие подходы, которые я пропускаю?