使用SQLite在附加数据库中使用触发器的效率
Efficiency using triggers inside attached database with SQLite
情况
我使用多个存储数据库作为一个中央"管理器"数据库的附件。
- 存储表在所有存储数据库中共享一个伪
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
使用预定义的语句,并将两个变量绑定到第一个查询的结果。
这太慢了。一旦我创建了注册表表,我的插入速度就会减慢,以至于无法达到基准速度。
可能的解决方案
我可以想象还有其他几种方法可以做到:
将所有索引的视图创建为所有表索引的
UNION
或OUTER JOIN
。这不能在连接的数据库上持久地完成。在创建表时为
INSERT
/REMOVE
创建触发器,以填充注册表表。这不能在连接的数据库上持久地完成。在创建数据库时为
CREATE TABLE
创建一个触发器,该触发器将创建上述触发器。需要用户功能。
问题
现在,在我添加用户功能(这是我以前从未做过的(之前,如果这有机会解决我的性能问题,我想听听一些建议。
- 假设我在附加数据库之前使用单独的连接创建数据库。我可以在数据库上创建视图和/或触发器(作为
main
模式(吗?当我通过ATTACH
连接到数据库时,这些视图和(或(触发器稍后可以工作吗 - 从外观上看,触发器
AFTER INSERT
将在插入的每一行之后触发。如果它将内容插入到另一个表中,这是否意味着我的事务数从2增加到1+N?或者有没有一种机制可以加速触发的交互?第一种情况会严重减缓事态发展 FULL OUTER JOIN
(我知道我需要从其他JOIN
命令创建它(是否比每次用插入事务填充注册表更快?我们谈论的大约是每秒10个事务,平均1000个元素(插入(,而每两秒钟一个查询30000个(查询(
以多线程模式打开sqlite3数据库,通过单独的线程处理insert/update/query/delete函数。我更喜欢将查询结果传输到stl容器中进行处理。
相关文章:
- 物理键盘上的触发器按键
- 为什么当我解模块化时,这个C++代代码"效率较低"?
- 代码的效率. 转到和函数调用
- 对于循环C++可能效率低下
- 内存效率表示最短路径的方法?
- 如何提高该函数的运行效率?
- 效率:标准::数组与标准::矢量
- 如何提高BST的搜索操作效率?
- 字符串引用参数的效率C++
- 提高基于组件的游戏引擎的效率
- 在 c++ 中使用带有映射的插入效率
- 关于效率的问题
- 防止SC_METHOD在没有事件/触发器的情况下执行
- 在SQLITE数据库中写入记录需要花费大量时间.如何提高刀片操作效率?
- 寻求提高Microsoft密封库计算效率的方法
- 做对了一个类似竞争的问题,但需要帮助来提高效率
- C++ - 与 Numpy 中的矢量版本相比,Argsort 效率低的矢量版本实现
- C++,在对象内分配多个数据时,堆栈分配是否更有效? 在下面的程序中,类A_Heap的效率会更低吗?
- visual C++|循环效率
- 使用SQLite在附加数据库中使用触发器的效率