要在PostgreSQL中插入批量数据/填充数据库,最快的方法是使用COPY。 Source
我必须填充数据库。现在我得到了写入速度低至每秒100-200。这涉及通过C++库libpqxx发送许多单独的INSERTS。这两个原因,我想主要有:使用libpqxx批量存储数据或如何在libpqxx中使用COPY语句
- 数据有许多重复的记录。(我有原始日志,我解析并发送。)这导致主键异常。
- 插入语句的逐个发送。
第一个不在我的手中。不过,我正在读第二本。
据我所知,tablewriter类适合这个目的。但它显然已被弃用。我读过可以使用stdin作为参数来复制。
但是在这些线索之后,我迷了路。有人能让我找到解决方案吗?
编辑: 下面是代码,在那里我有执行statemnt功能:
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;
}
}
我建立连接前,并通过对它的引用。
PS:这个问题可能缺少一些细节。如果是这样,请评论,我将编辑并添加它们。
检查您是否没有为每个插入事件启动新的事务。你应该在一次交易中完成所有这些工作。如果可能,请显示相关的代码。 –
@DanielVérité我添加了我的代码。我怀疑它发生在一个事务中,但是我不知道如何使用libpqxx控制事务。 – digvijay91
是的,这段代码提交每个INSERT,这是不好的。您希望重新构建它只为循环中的每一行执行'w.exec(..)',并在此循环之外具有'pqxx :: work'实例化和'w.commit()'。 –