gpt4 book ai didi

c++ - SQLite 真的很慢

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:22:31 25 4
gpt4 key购买 nike

我一直在努力让 sqlite 在我的 C++ 程序中更快。我认为结果与预期的相去甚远。

我在数据库中有几张表,其中大部分有几条记录,还有一张有大量记录 (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);

(为了简单起见,我更改了表和列的名称)。这个查询在一个 while cicle 中,并且在同一个事务中完成了很多次。选择查询 500 次大约需要 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;

你能帮我调整数据库吗?我做错了什么?

最佳答案

选项一:有没有可能使用整数主键而不是字符串 - 它真的会破坏 SELECT 性能。

选项二:该表有多少列,您的记录集中是否需要所有列?如果您能节省读取和复制数据的时间,您可能会获得更好的结果。

选项三:有没有可能重写由 sqlite3_step 控制的循环而不是人工外部控制?迭代记录集(偶尔跳过未使用的行)比每次重新选择新记录集要好很多。将数据保存到 map 表明这应该是可能的。

关于c++ - SQLite 真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31075264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com