2015-06-26 130 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控制的循环而不是人工外部控制?记录集上的迭代(偶尔跳过未使用的行)比每次重新选择新记录集要好得多。将数据保存到地图中表明这应该是可能的。