我需要使用libpqxx将大量数据(大约7.000.000个条目)批量加载到PostgreSQL数据库中。我已经阅读了关于how to populate the database的文档,但我不确定如何在我的案例中使用它。首先,我不能使用文件,所以数据库上的COPY是不成问题的。此外,数据库和我正在加载到的表需要在我导入时是有效的。
场景如下:我们以固定的时间间隔(大约一个月一次)从另一个应用程序获得一个包含所有数据(包括已经存在的条目)的文件。由于条目的数量,不可能检查每个条目是否存在,我们只能批量插入新数据(在预处理之后)。
目前,为了处理这个问题,我创建了一个新表,使用libpqxx中的tablewriter插入数据(没有事务),然后在事务中重命名旧表,并将新表重命名到正确的位置。
此外,我们不仅需要为一个表执行此操作,还需要为具有不同布局的多个表执行此操作。因此,我尝试将表的编写与日期的解析分开。现在,我只需要考虑表的创建。为此,我使用了
create temporary table foo_temp (like foo including indexes including defaults including constraints );这样我就得到了一个类似于foo的表格,并且我不需要知道我写东西的地方的布局。然而,这给我留下了一个问题,那就是这将产生一个带有索引和约束的表,上面的指南说索引将使批量插入变慢。但是,如果我删除了索引和约束(或者一开始就不复制它们),那么我需要一种方法,以便以后在为原始表设置的相同庄园中重新创建它们。
对于如何快速处理这个问题,有什么好的建议吗?
编辑:
与之相关的是:我刚刚注意到,使用数据库时,上面的CREATE TABLE不会复制任何外键约束,因此我似乎也需要手动指定这些约束。或者,是否有一种方法可以将这些约束与所有其他约束一起处理?
发布于 2011-06-08 05:50:50
有一个引用索引和约束的pg_index和pg_constraint表。(前者需要与pg_class连接才能获得完整的详细信息。)有关详细信息,请参阅pg_catalog。
在批量插入/更新之后,您可以使用后者来获取所需的索引定义,等等。
发布于 2011-08-21 14:40:02
通过使用next策略创建索引和约束,我实现了每秒超过100000次插入: 1.在继承父级的第一个连接create table中,使用PQputCopyData以二进制模式复制数据。2.使用其他几个连接创建索引。PostgreSQL为每个客户端创建一个线程,因此为了利用多核优势,我们需要使用多个连接。
您可以使用线程安全队列或PostgreSQL NOTIFY将数据发送到应用程序内的索引线程。
发布于 2011-06-08 06:07:31
使用COPY时不需要外部文件。你可以从"STDIN“复制。"STDIN指定输入来自客户端应用程序。“
例如,使用pg_dumpall,它将向您展示如何对现有数据使用/format COPY。
您可以使用PQputCopyData向PostgreSQL服务器传输必要的批量数据。
http://www.postgresql.org/docs/9.0/interactive/libpq-copy.html#LIBPQ-COPY-SEND
https://stackoverflow.com/questions/6262876
复制相似问题