【问题标题】:SQLite really slowSQLite 真的很慢
【发布时间】:2015-06-26 14:03:57
【问题描述】:

我一直在努力让我的 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);

(为了简单起见,我更改了表和列的名称)。 此查询在一段时间内进行,并且在同一事务中执行了很多次。选择查询 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;

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

【问题讨论】:

  • 出于好奇,(... just saving data in a list)全部注释掉时的表现如何?
  • 您可能感兴趣:thosetwo 答案。
  • @WhozCraig 对不起,我的意思是地图。它几乎需要同样的时间。
  • @Siguza 谢谢你的帖子。我已经应用了大部分建议,但结果仍然相同:/
  • 您确定该列是主键吗?显示EXPLAIN QUERY PLAN的输出。

标签: c++ database macos performance sqlite


【解决方案1】:

选项一: 是否不可能有整数主键而不是字符串 - 它真的会扼杀 SELECT 性能。

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

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

【讨论】:

    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 2010-12-28
    • 2013-01-25
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    相关资源
    最近更新 更多