要在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()'。 –