Qt插入大量資料到sqlite資料庫,使用事務提升效率(效率提高的驚人)

Qt插入大量資料到sqlite資料庫,使用事務提升效率(效率提高的驚人)

Qt在操作大量資料執行插入操作時,推薦使用事務

1.SQLite資料庫本質上來講就是一個磁碟上的檔案,所以一切的資料庫操作其實都會轉化為對檔案的操作,而頻繁的檔案操作將會是一個很好時的過程,會極大地影響資料庫存取的速度。例如:向資料庫中插入100萬條資料,在預設的情況下如果僅僅是執行query.exec(“insert into DataBase(……) values(……)”);就會開啟和關閉檔案100萬次,所以速度當然會很慢。

2.SQLite資料庫是支援事務操作的,於是我們就可以通過事務來提高資料庫的讀寫速度。事務的基本原理是:資料庫管理系統首先會把要執行的sql語句儲存到記憶體當中,只有當commit()的時候才一次性全部執行所有記憶體中的資料庫。

不用事務

如果不用事務,插入1000條資料到sqlite資料庫,要執行1000次開啟事務、結束事務,大致意思如下圖:
這裡寫圖片描述

使用事務

如果使用事務,儲存1000條資料到sqlite資料庫,只需要執行一次開啟事務、結束事務操作,大致意思如下圖:
這裡寫圖片描述
時間成本應該就是節約在多餘的開啟事務和結束事務這裡。

口說無憑,下面上截圖,大致儲存了6000條資料,使用事務之前,需要花費7分鐘左右,下面是使用事務之後,僅僅用了2秒鐘:
這裡寫圖片描述

Qt中使用事務的大致方法:

db.transaction();
執行插入的sql(n條插入操作)
db.commit();

例項

下面是一段我寫的程式碼,insert是我封裝的一個執行sql語句的介面:
/新增資料到XXX表/

bool DbManager::appendData2MfCali(const QList<MfCalibrate> &data)
{
if(data.isEmpty())
return false;
mDb->beginTransaction(); //開啟事務
foreach (MfCalibrate v, data)
{
QVector<QString> fieldValue;
fieldValue.append(QString::number(v.RfChannel));     
fieldValue.append(QString::number(v.MfChannel));     
fieldValue.append(QString::number(v.RfFreq));       
fieldValue.append(QString::number(v.CollectValue));  
fieldValue.append(QString::number(v.AmpCaliValue));  
if(!mDb->insert("XXX表",mMfCaliFieldsName , fieldValue))
return false;
}
mDb->commitTransaction(); //提交
return true;
}