Sqlite3常用的插入方法及效能測試

2021-07-12 01:48:40 字數 2170 閱讀 8418

最近在做乙個大資料量快取重傳系統的優化,其中用到的sqlite技術,把自己的學習心得整理了一下

慢插入-

暴力插入

呼叫sqlite3_exec()函式,會隱式地開啟了乙個事務,其次,sqlite3_exec() 是sqlite3_perpare(),sqlite3_step(),  sqlite3_finalize()的乙個結合,每呼叫一次這個函式,就會重複的執行這三條語句,對於相同的語句,其中sqlite3_perpare相當於編譯sql語句,如果語句相同且重複操作,就會增加很多重複操作。如果插入一條資料,就調該函式一次,事務就會被反覆地開啟、關閉,會增大io量。所以當大批量資料插入時,此方法簡直無法忍受。

事務插入

-顯示的開啟事務

所謂」事務「就是指一組sql命令,這些命令要麼一起執行,要麼都不被執行。如果在插入資料前顯式開啟事務,插入後再一起提交,則會大大提高io效率,進而加資料快插入速

度同步關閉模式

當synchronous設定為full, sqlite資料庫引擎在緊急時刻會暫停以確定資料已經寫入磁碟。這使系統崩潰或電源出問題時能確保資料庫在重起後不會損壞。full 

synchronous很安全但很慢。

當synchronous設定為normal, sqlite資料庫引擎在大部分緊急時刻會暫停,但不像full模式下那麼頻繁。 normal模式下有很小的機率(但不是不存在)發生電源故障導致

資料庫損壞的情況。但實際上,在這種情況 下很可能你的硬碟已經不能使用,或者發生了其他的不可恢復的硬體錯誤。

當設定為synchronous off時,sqlite在傳遞資料給系統以後直接繼續而不暫停。若執行sqlite的應用程式崩潰, 資料不會損傷,但在系統崩潰或寫入資料時意外斷   電的情

況下資料庫可能會損壞。另一方面,在synchronous off時 一些操作可能會快50倍甚至更多。在sqlite 2中,預設值為normal.而在3中修改為full。

執行前準備

此方法就是「執行準備」(類似於儲存過程)操作,即先將sql語句編譯好,然後再一步一步(或一行一行)地執行。如果採用前者的話,就算開起了事務,sqlite仍然要對迴圈

中每一句sql語句進行「詞法分析」和「語法分析」,這對於同時插入大量資料的操作來說,簡直就是浪費時間。因此,要進一步提高插入效率的話,就應該使用此方法

測試結果展示

源**

extern "c"

;#include#include #include #include #include #include#define max_test_count 200

using namespace std;

int main()

{ char cmdcreattable[256] = "create table sqlitetest (id integer , x integer , y integer, weight real)" ;

sqlite3* db = null;

char * errormessage = null;

int iresult = sqlite3_open("sqlitetest.db", &db);

do {

if (sqlite_ok != iresult)

{ cout<

解決sqlite3插入資料很慢的問題

初用sqlite3插入資料時,插入每條資料大概需要100ms左右。如果是批量匯入,可以引進事物提高速度。但是假設你的業務是每間隔幾秒插入幾條資料,顯然100ms是不能容許的。解決辦法是,在呼叫sqlite3 open函式後新增下面一行 sqlite3 exec db,pragma synchrono...

解決sqlite3插入資料很慢的問題

初用sqlite3插入資料時,插入每條資料大概需要100ms左右。如果是批量匯入,可以引進事物提高速度。但是假設你的業務是每間隔幾秒插入幾條資料,顯然100ms是不能容許的。解決辦法是,在呼叫sqlite3 open函式後新增下面一行 sqlite3 exec db,pragma synchrono...

SQLite3常用物件和函式

1.物件 sqlite3 database 資料庫控制代碼,在建立和開啟資料庫或者建立 時使用 sqlite3 stmt statement 封裝好的sql語句,在插入 查詢 刪除中使用 2.函式 sqlite3 open path,database 開啟資料庫,如果不存在則建立 sqlite3 c...