2015-06-26 129 views
4

我一直在努力讓sqlite在我的C++程序中快得多。我相信結果遠不如預期的。SQLite真的很慢

我在數據庫中有幾張表,其中大多數有幾條記錄,另一條有很多記錄(4986450)。要達到這個尺寸真的很難,因爲每次交易的插入次數太多,而且插入太慢。

在另一方面,我現在對大表做一個簡單的查詢,如

sqlite3_prepare_v2(db,"SELECT * FROM Table where primary_key=?1;",-1, &query,NULL); 
sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, &sErrMsg); 
.... 
while(running){ 
    sqlite3_bind_text(query, 1, pkey.c_str(), (int)pkey.size() , SQLITE_STATIC); 

    int query_status = sqlite3_step(query); 
    if(query_status == SQLITE_ROW){ 
     data = sqlite3_column_int(query,1); 
     (... just saving data in a map) 
    } 
} 
sqlite3_exec(db, "END TRANSACTION", NULL, NULL, &sErrMsg); 

(我已經改變表和列的名字只是爲了簡單)。 這個查詢是在一段時間的cicle中,並且在同一個事務中做了很多次。選擇查詢需要大約9秒鐘的時間。即使我將數據插入表格,我也可以獲得更好的時間。

我有數據庫

PRAGMA main.page_size = 4096; 
PRAGMA main.cache_size=10000; 
PRAGMA main.locking_mode=EXCLUSIVE; 
PRAGMA main.synchronous=OFF; 
PRAGMA main.journal_mode=WAL; 
PRAGMA main.cache_size=5000; 

你能幫我tunning對數據庫以下編譯?我究竟做錯了什麼?

+0

出於好奇,當'(...只是將數據保存在列表中)'完全被*註釋掉時,性能如何? – WhozCraig

+1

可能對您感興趣:[那些](http://stackoverflow.com/a/2929821/2302862)[two](http://stackoverflow.com/a/8888410/2302862)答案。 – Siguza

+0

@WhozCraig對不起,我的意思是地圖。這幾乎是同一時間。 – anatp2015

回答

0

選項一: 是否有可能具有整數主鍵而不是字符串 - 它真的殺死了SELECT性能。

選項二: 表中有多少列,你需要在你的記錄集中有多少列?如果您可以節省閱讀和複製數據,您可能會獲得更好的結果。

選項三: 是否不可能重寫由sqlite3_step控制的循環而不是人工外部控制?記錄集上的迭代(偶爾跳過未使用的行)比每次重新選擇新記錄集要好得多。將數據保存到地圖中表明這應該是可能的。