使用SQLite在附加数据库中使用触发器的效率

Efficiency using triggers inside attached database with SQLite

本文关键字:触发器 效率 数据库 SQLite 使用      更新时间:2023-10-16

情况

我使用多个存储数据库作为一个中央"管理器"数据库的附件。

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

当前解决方案

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

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

这样,我就记住了开始和结束索引。接下来,我将它绑定到注册表表中的插入语句:

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 JOIN。这不能在连接的数据库上持久地完成。

  2. 在创建表时为INSERT/REMOVE创建触发器,以填充注册表表。这不能在连接的数据库上持久地完成。

  3. 在创建数据库时为CREATE TABLE创建一个触发器,该触发器将创建上述触发器。需要用户功能。

问题

现在,在我添加用户功能(这是我以前从未做过的(之前,如果这有机会解决我的性能问题,我想听听一些建议。

  • 假设我在附加数据库之前使用单独的连接创建数据库。我可以在数据库上创建视图和/或触发器(作为main模式(吗?当我通过ATTACH连接到数据库时,这些视图和(或(触发器稍后可以工作吗
  • 从外观上看,触发器AFTER INSERT将在插入的每一行之后触发。如果它将内容插入到另一个表中,这是否意味着我的事务数从2增加到1+N?或者有没有一种机制可以加速触发的交互?第一种情况会严重减缓事态发展
  • FULL OUTER JOIN(我知道我需要从其他JOIN命令创建它(是否比每次用插入事务填充注册表更快?我们谈论的大约是每秒10个事务,平均1000个元素(插入(,而每两秒钟一个查询30000个(查询(

以多线程模式打开sqlite3数据库,通过单独的线程处理insert/update/query/delete函数。我更喜欢将查询结果传输到stl容器中进行处理。