最近在做乙個大資料量快取重傳系統的優化,其中用到的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...