使用SQLite

时间:2016-09-17 16:17:19

标签: c++ sqlite

场合

我使用多个存储数据库作为一个中央“经理”数据库的附件。

  • 存储表在所有存储数据库中共享一个伪 - AUTOINCREMENT索引。
  • 我需要经常迭代共享索引。
  • 存储数据库创建时,不知道存储表的最终数量和名称。
  • 在某些信号上,将删除当时给定的条目范围。
  • 至关重要的是,没有插入失败,并且在信号发出之前不会删除任何条目。
  • 能量中断是可能的,在这种情况下数据丢失很难,如果有的话,是可以容忍的。任何可能导致此问题的解决方案(内存数据库等)都不可行。
  • 目前使用strands控制数据库访问。这需要顺序访问。
  • 由于INSERT事务的频率很高,我必须手动触发WAL检查点。我见过其他大小不超过2GB的期刊。

当前解决方案

我正在使用参数绑定将数据集插入到预先创建的语句中。

INSERT INTO datatable VALUES (:idx, ...);

这样做,我记得开始和结束索引。接下来,我将它绑定到注册表中的insert语句:

INSERT INTO regtable VALUES (:idx, datatable);

我的查询确定要返回的数据集如下:

SELECT MIN(rowid), MAX(rowid), tablename
FROM (SELECT rowid,tablename FROM entryreg LIMIT 30000)
GROUP BY tablename;

之后,我查询

SELECT * FROM datatable WHERE rowid >= :minid AND rowid <= :maxid;

我在每个datatable使用预定义语句,并将两个变量绑定到第一个查询的结果。

这太慢了。一旦我创建了注册表,我的插入速度就会慢下来,我无法达到基准速度。

可能的解决方案

我可以想象还有其他几种方法可以做到:

  1. 创建所有索引的视图,作为所有表索引的UNIONOUTER JOINThis can't be done persistently on attached databases.

  2. 在填充注册表的表创建上为INSERT / REMOVE创建触发器。 This can't be done persistently on attached databases.

  3. 在数据库创建时为CREATE TABLE创建一个触发器,该触发器将创建上述触发器。 Requires user functions.

  4. 问题

    现在,在我去添加用户功能之前(我之前从未做过的事情),如果有任何机会解决我的性能问题,我想提供一些建议。

    • 假设我在附加数据库之前使用单独的连接创建数据库。我可以在数据库上创建视图和/或触发器(作为main架构),以后通过ATTACH连接到数据库时可以使用吗?
    • 从它的外观看,触发器AFTER INSERT将在每一行插入后触发。如果它将东西插入另一个表中,这是否意味着我将交易数量从2增加到1 + N?或者是否存在加速触发交互的机制?第一种情况会让事情变得非常糟糕。
    • FULL OUTER JOIN(我知道我需要create it from other JOIN commands)是否有可能比每次填充插入事务的注册表更快?我们每秒大约讨论10个事务,平均每1000个元素(插入)与每两秒30000个查询(查询)。

1 个答案:

答案 0 :(得分:0)

以多线程模式打开sqlite3数据库,通过单独的线程处理插入/更新/查询/删除功能。我更喜欢将查询结果传输到stl容器进行处理。