要在PostgreSQL中插入大量数据/填充数据库,最快的方法是使用COPY。来源
我需要填充一个数据库。目前我每秒只能得到100-200个写入速度。这涉及通过C++库libpqxx发送许多单独的INSERT。我认为有两个原因:
据我所知,tablewriter类适用于此目的。然而,它已经被弃用了。我已经了解到可以使用stdin作为copy的参数。 但是在这些线索之后,我迷失了。有人能帮我找到解决方案吗?
我之前建立了连接,并传递了一个引用。
注:该问题可能缺少一些细节。如果有的话,请评论,我会进行编辑并添加它们。
我需要填充一个数据库。目前我每秒只能得到100-200个写入速度。这涉及通过C++库libpqxx发送许多单独的INSERT。我认为有两个原因:
- 数据有很多重复记录。(我有原始日志,我解析并发送。)这会导致主键异常。
- 逐个发送Insert语句。
据我所知,tablewriter类适用于此目的。然而,它已经被弃用了。我已经了解到可以使用stdin作为copy的参数。 但是在这些线索之后,我迷失了。有人能帮我找到解决方案吗?
编辑: 这里是代码,其中我有一个执行语句的函数:
void pushLog(Log log,pqxx::connection *conn){
pqxx::work w(*conn);
std::stringstream stmt;
stmt<<"INSERT INTO logs VALUES('"<<log.getDevice()<<"','"<<log.getUser()<<"','"<<log.getDate()<<"','"<<log.getLabel()<<"');";
try{
pqxx::result res = w.exec(stmt.str());
w.commit();
}
catch(const std::exception &e){
std::cerr << e.what() << std::endl;
std::cout<<"Exception on statement:["<<stmt.str()<<"]\n";
return;
}
}
我之前建立了连接,并传递了一个引用。
注:该问题可能缺少一些细节。如果有的话,请评论,我会进行编辑并添加它们。
w.exec(..)
,并将pqxx::work
实例化和w.commit()
放在循环外面。 - Daniel Vérité