场合
我使用多个存储数据库作为一个中央“经理”数据库的附件。
AUTOINCREMENT
索引。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
使用预定义语句,并将两个变量绑定到第一个查询的结果。
这太慢了。一旦我创建了注册表,我的插入速度就会慢下来,我无法达到基准速度。
可能的解决方案
我可以想象还有其他几种方法可以做到:
创建所有索引的视图,作为所有表索引的UNION
或OUTER JOIN
。 This can't be done persistently on attached databases.
在填充注册表的表创建上为INSERT
/ REMOVE
创建触发器。 This can't be done persistently on attached databases.
在数据库创建时为CREATE TABLE
创建一个触发器,该触发器将创建上述触发器。 Requires user functions.
问题
现在,在我去添加用户功能之前(我之前从未做过的事情),如果有任何机会解决我的性能问题,我想提供一些建议。
main
架构),以后通过ATTACH
连接到数据库时可以使用吗?AFTER INSERT
将在每一行插入后触发。如果它将东西插入另一个表中,这是否意味着我将交易数量从2增加到1 + N?或者是否存在加速触发交互的机制?第一种情况会让事情变得非常糟糕。FULL OUTER JOIN
(我知道我需要create it from other JOIN
commands)是否有可能比每次填充插入事务的注册表更快?我们每秒大约讨论10个事务,平均每1000个元素(插入)与每两秒30000个查询(查询)。答案 0 :(得分:0)
以多线程模式打开sqlite3数据库,通过单独的线程处理插入/更新/查询/删除功能。我更喜欢将查询结果传输到stl容器进行处理。