我有很多數據,我想在最短的時間內插入數據庫。我做了一些測試。我在PostgreSQL中創建一個表(使用下面的腳本):PostgreSQL中的快速批處理執行
CREATE TABLE test_table
(
id serial NOT NULL,
item integer NOT NULL,
count integer NOT NULL,
CONSTRAINT test_table_pkey PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
ALTER TABLE test_table OWNER TO postgres;
我寫測試代碼,創建1000個隨機值,並在兩種不同的方式插入到test_table
。首先,使用QSqlQuery::exec()
int insert() {
QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
db.setHostName("127.0.0.1");
db.setDatabaseName("TestDB");
db.setUserName("postgres");
db.setPassword("1234");
if (!db.open()) {
qDebug() << "can not open DB";
return -1;
}
QString queryString = QString("INSERT INTO test_table (item, count)"
" VALUES (:item, :count)");
QSqlQuery query;
query.prepare(queryString);
QDateTime start = QDateTime::currentDateTime();
for (int i = 0; i < 1000; i++) {
query.bindValue(":item", qrand());
query.bindValue(":count", qrand());
if (!query.exec()) {
qDebug() << query.lastQuery();
qDebug() << query.lastError();
}
} //end of for i
QDateTime end = QDateTime::currentDateTime();
int diff = start.msecsTo(end);
return diff;
}
其次使用QSqlQuery::execBatch
:
int batchInsert() {
QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
db.setHostName("127.0.0.1");
db.setDatabaseName("TestDB");
db.setUserName("postgres");
db.setPassword("1234");
if (!db.open()) {
qDebug() << "can not open DB";
return -1;
}
QString queryString = QString("INSERT INTO test_table (item, count)"
" VALUES (:item, :count)");
QSqlQuery query;
query.prepare(queryString);
QVariantList itemList;
QVariantList CountList;
QDateTime start = QDateTime::currentDateTime();
for (int i = 0; i < 1000; i++) {
itemList.append(qrand());
CountList.append(qrand());
} //end of for i
query.addBindValue(itemList);
query.addBindValue(CountList);
if (!query.execBatch())
qDebug() << query.lastError();
QDateTime end = QDateTime::currentDateTime();
int diff = start.msecsTo(end);
return diff;
}
我發現,它們之間沒有什麼區別:
int main() {
qDebug() << insert() << batchInsert();
return 1;}
結果:
14270 14663 (milliseconds)
^h我能改善它嗎?
在http://doc.qt.io/qt-5/qsqlquery.html#execBatch已被引用:
如果數據庫不支持批量處理,司機會 使用傳統的exec()調用模擬。
我不確定我的DBMS是否支持批處理執行? 我該如何測試它?
確保您的連接不是自動提交。如果這是我的答案的目標將會丟失,因爲它會在每次發佈插入時提交,而不是等待最終的提交語句。 – Kuberchaun