我正在做日志文件的ETL到PostgreSQL数据库,并且想了解更多关于用于优化将数据加载到简单的星型模式中的性能的各种方法。SQL - 优化批量插入和大型连接的性能?
摆在上下文中的问题,下面是我目前做一个概述:
- 删除所有外键和唯一 约束
- 导入数据(约100万条记录)
- 回复 - 创建约束并在事实表上运行分析。
导入数据是通过从文件加载完成的。对于每一个文件:
1)利用COPY从数据加载到临时表(PostgreSQL的大量上传工具)
2)更新每个9代维表的使用的插入对于每个这样的任何新的数据如:
INSERT INTO host (name)
SELECT DISTINCT host_name FROM temp_table
EXCEPT
SELECT name FROM host;
ANALYZE host;
的Analyze在拥有超过千万的更新的过程中保持统计最新(的想法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
是否有更好的方法我俯瞰?
我原则上同意,但是当我尝试这种方法时,我发现它平均慢了50%。它看起来像维度表的缓存结合做大量操作(而不是单独的选择/插入)更快。 – Rob 2009-08-05 19:19:20
@Rob:这很有趣,因为它是一种过去为我工作的方法。顺便说一句,我不能相信这个答案没有任何评论downvoted! – Adamski 2009-08-12 09:52:34