我需要使用libpqxx向PostgreSQL数据库批量加载大量数据(约7,000,000条记录)。我已经阅读了如何填充数据库的文档,但是不确定如何在我的情况下使用它。首先,我不能使用文件,因此无法在数据库上执行COPY。而且,在导入期间,需要保持数据库和我正在加载的表格的功能。
场景如下:我们定期从另一个应用程序获取包含所有数据(包括已存在的条目)的文件(大约每月一次)。由于条目数量太多,不可能检查每个条目是否存在,因此我们只对新数据进行批量插入(预处理后)。
目前,为了处理这个问题,我创建一个新表,使用libpqxx中的tablewriter插入数据(没有事务),然后在事务中将旧表重命名并将新表重命名为正确的名称。
此外,我们不仅需要为一张表格执行此操作,还需要为多个具有不同布局的表格执行此操作。因此,我尝试将表格的编写与日期的解析分开。现在我只需要将表格的创建分离出来。为此,我使用了一个 。
这样我就能得到一个类似于
有没有什么好的提示可以快速处理这个问题?
编辑:
在相关的一面:玩弄数据库时,我刚刚注意到,上面的
场景如下:我们定期从另一个应用程序获取包含所有数据(包括已存在的条目)的文件(大约每月一次)。由于条目数量太多,不可能检查每个条目是否存在,因此我们只对新数据进行批量插入(预处理后)。
目前,为了处理这个问题,我创建一个新表,使用libpqxx中的tablewriter插入数据(没有事务),然后在事务中将旧表重命名并将新表重命名为正确的名称。
此外,我们不仅需要为一张表格执行此操作,还需要为多个具有不同布局的表格执行此操作。因此,我尝试将表格的编写与日期的解析分开。现在我只需要将表格的创建分离出来。为此,我使用了一个 。
create temporary table foo_temp (like foo including indexes including defaults including constraints );
这样我就能得到一个类似于
foo
的表,而我不需要真正了解我写作的地方的布局。然而,这给我留下了一个问题,这将产生一个带有索引和约束的表,而上面的指南说索引会使大块插入变慢。然而,如果我删除索引和约束(或者一开始就不复制它们),我需要一种方法来以相同的方式重新创建它们,就像它们为原始表设置的那样。有没有什么好的提示可以快速处理这个问题?
编辑:
在相关的一面:玩弄数据库时,我刚刚注意到,上面的
CREATE TABLE
不会复制任何外键约束,所以似乎我还需要手动指定这些内容。或者有没有一种方法可以将这些与所有其他约束一起处理?