我使用PostgreSQL的COPY加载了一个巨大的CSV数据集 - Eclipse的Filtered Usage Data,它占用了大量的空间,因为它没有规范化:三个TEXT列更有效地重构为单独的表,到使用外键列从主表中引用。
我的问题是:在加载所有数据之后重构数据库是否更快,或者创建具有所有约束的目标表,然后加载数据?前者涉及重复扫描一个巨大的表(接近10 ^ 9行),而后者将涉及每个CSV行进行多次查询(例如之前是否看过这种动作类型?如果不是,请将其添加到actions表中,获取其ID,在主表中使用正确的操作ID等创建一行。)。
现在每个重构步骤大约需要一天左右,初始加载也需要大约相同的时间。
答案 0 :(得分:3)
根据我的经验,您希望将您关注的所有数据放入数据库中的临时表中并从那里开始,之后执行尽可能多的基于集合的逻辑,因为您很可能通过存储过程。加载到临时表时,表上没有任何索引。将数据加载到表中后创建索引。
点击此链接可获取一些提示http://www.postgresql.org/docs/9.0/interactive/populate.html