1. 程式人生 > >Qt SQLite 批量插入優化(SQLite默認將每條語句看成單獨的事務)good

Qt SQLite 批量插入優化(SQLite默認將每條語句看成單獨的事務)good

容器 執行 優化 還需要 文件的 項目 還需 qlite 關閉

使用SQLite存儲數據時發現插入速度太慢,程序跑了將近五分鐘才插入了不到三千條。上網查資料才發現,SQLite這種文件數據庫與MySql機制不一樣,每條事務都有打開和關閉文件的步驟,SQLite默認將每條語句看成單獨的事務。當我逐條插入數據時,就會出現大量的文件IO操作,效率自然不高。需要將多個插入操作放到一個事務中,就可以顯著提升插入效率。

QT中使用事務的方法如下:

QSqlDatabase app_database;
// 設置數據庫參數
// ...
app_database.transaction(); // 開始一個事務
// 執行SQL操作
// ...
app_database.commit(); // 提交


但項目中需要獲取插入後自動生成的id。逐條插入時,可以用QSqlQuery::lastInsertId()方法獲取,但使用事務進行批量插入後,就無法用lastInsertId(),因為我們需要獲取插入數據的ID集。為了將ID賦給對象,還需要確保與對象的一一對應關系。

因為項目中父對象包含多個子對象,保存在QVector容器中,所以我利用QVector的有序性來保證對象的對應關系。將子對象在QVector中的下標index保存在數據庫中,批量插入子對象後,將所有子對象的id和index一同取出,根據index設置相應對象的id。這樣,就可以用事務批量插入子對象,再填充子對象的ID。

http://windrocblog.sinaapp.com/?p=835

Qt SQLite 批量插入優化(SQLite默認將每條語句看成單獨的事務)good