PostgreSQL中多次插入所需的优化

PostgreSQL中多次插入所需的优化,sql,postgresql,Sql,Postgresql,我基本上有三张桌子。一个是核心表,另两个取决于第一个。我需要在所有表中添加多达70000条记录。我确实为表设置了约束(主键和外键、索引、唯一性等)。我不能进行批量导入(使用COPY命令),因为在需求中没有标准的.csv文件,而且映射是明确需要的,并且在基于C的编程文件中外部应用了很少的验证。每个记录详细信息(高达70000)将从.pgc(一个基于ECPG的C编程文件)传递到postgresql文件。前几条记录所需的时间更短,而后几条记录的性能则变得更差!结果是非常可悲的,它需要几天来覆盖多达20

我基本上有三张桌子。一个是核心表,另两个取决于第一个。我需要在所有表中添加多达70000条记录。我确实为表设置了约束(主键和外键、索引、唯一性等)。我不能进行批量导入(使用COPY命令),因为在需求中没有标准的.csv文件,而且映射是明确需要的,并且在基于C的编程文件中外部应用了很少的验证。每个记录详细信息(高达70000)将从.pgc(一个基于ECPG的C编程文件)传递到postgresql文件。前几条记录所需的时间更短,而后几条记录的性能则变得更差!结果是非常可悲的,它需要几天来覆盖多达20000!我可以参与哪些绩效评估?请引导我

我的主表的架构是

CREATE TABLE contacts 
( contact_id SERIAL PRIMARY KEY
, contact_type INTEGER DEFAULT 0
, display_name TEXT NOT NULL DEFAULT ''
, first_name TEXT DEFAULT ''
, last_name TEXT DEFAULT ''
, company_name TEXT DEFAULT ''
, last_updated TIMESTAMP NOT NULL DEFAULT current_timestamp
, UNIQUE(display_name)
) WITHOUT OIDS;

删除/禁用索引/触发器,并使用副本。我们使用它在几分钟内导入数百万行和千兆字节的数据

文件在此处对此进行了深入介绍:


如果你用正确的方法,Postgres在批量加载数据方面非常出色。

你是从一个(几乎)空的表开始测量的吗?你的插入是在一次大交易中完成的吗?如果是这样的话,缓存的查询计划可能已经坏了。即使您发出单个插入,20000行也不需要几天。我可以用常规的insert语句在笔记本电脑上每秒插入大约5000行,即使对于大型表也是如此。一定有什么你没有告诉usPls阅读我对以下成员的回复。你能告诉我如何减少时间消耗吗?我有postgresql 8.1.4;Linux操作系统。我的主表的模式是创建表联系人(联系人id序列主键,联系人类型整数默认值0,显示名称文本不为空默认值“”,第一个名称文本默认值“”,最后一个名称文本默认值“”,公司名称文本默认值“”,最后一个更新的时间戳不为空默认值当前时间戳,唯一(显示名称)),不带OID;现在我们有了一个表的定义。其他两个表中有什么,它们之间有什么关系?@Siva您能告诉我们其他两个表的确切DDL SQL,包括所有外键和索引吗?有外键延迟了吗?在父表和子表中插入行的比例是多少,顺序是什么(如果使用延迟FKs)?插入的执行计划是什么?我不认为可以使用COPY,因为我的主表中的字段有唯一和索引约束。如果我在多次插入之前删除它们,那就没有任何意义了!此外,由于任何原因,重复记录和失败记录应记录在单独的文件中,这就是我的要求!因此,我的C程序文件复制导入文件中的所有数据(记录),将每个记录传递到一个结构中,然后再传递给sql函数以插入到我的表中。如果我在导入文件中有70000条记录,我将在70000个调用或事务中传递70000条记录!