Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SqLITE3数据库加载到内存C++中并选择性能_C++_Sqlite - Fatal编程技术网

SqLITE3数据库加载到内存C++中并选择性能

SqLITE3数据库加载到内存C++中并选择性能,c++,sqlite,C++,Sqlite,在对sqlite3数据库文件进行任何选择之前,是否有任何方法将其从磁盘加载到内存中?sqlite3\u步骤工作非常慢。。。所以我想将数据库加载到内存中,以便快速加载数据 在sqlite3之前,我使用简单的二进制数据序列化,stackoverflow的所有成员都建议我使用sqlite3进行序列化,现在我的程序非常慢。。速度太慢,我无法取消序列化所有数据。序列化可以很好地处理事务 也许这也会有帮助。我的选择: 在每个未序列化对象上有两个SELECT和两个sqlite3_步骤。 查询看起来像是从表中为

在对sqlite3数据库文件进行任何选择之前,是否有任何方法将其从磁盘加载到内存中?sqlite3\u步骤工作非常慢。。。所以我想将数据库加载到内存中,以便快速加载数据

在sqlite3之前,我使用简单的二进制数据序列化,stackoverflow的所有成员都建议我使用sqlite3进行序列化,现在我的程序非常慢。。速度太慢,我无法取消序列化所有数据。序列化可以很好地处理事务

也许这也会有帮助。我的选择: 在每个未序列化对象上有两个SELECT和两个sqlite3_步骤。 查询看起来像是从表中为两个查询选择aaaa、bbb、ccc、ddd、eee、ggg、hhh、fff、jjj。 第一个表有唯一的aaaa键,但第二个表不是唯一的,所以看起来它根本没有索引

更新:

选择1:

选择2:

嗯,第二个表中的sid显示的问题似乎不是唯一的,也没有索引?如何将索引添加到此语句中


也许还有其他建议?

您想添加索引。由于列不是唯一的,因此需要使用单独的命令添加它:

CREATE INDEX showed_sid ON showed (sid);

创建表后立即执行此操作。

将数据加载到内存是操作系统的责任。它会做得很好的。更有可能的是,你的选择非常不理想。但是,如果您需要匿名,您必须向我们显示您想要的确切的selects和架构重命名列,但所有子句和条件必须匹配。@JanHudec,谢谢。完成了。谢谢,这是我的原始索引吗?我发现第5.0段中的跳过扫描优化似乎需要将所有列添加到索引中还是不添加?@abrahab:如果您正在读取的所有列都是索引,sqlite将直接从索引中读取结果,而不需要访问主表。但它放大了指数,从而减慢了指数。因此,如果您有一个只从包含更多列的表中读取几列的查询,那么一定要使用它,并将结果列添加到索引中。但是如果你正在阅读所有的专栏,它可能会快一点,也可能会慢一点。在任何一种情况下,与您通过索引获得的结果相比,差异都很小。如果它真的对性能至关重要,那么您应该测试它。谢谢,现在我可以确认,使用您的解决方案,我的选择工作得更快,但现在出现了一个新问题:数据库很大,在大表上进行非序列化时,我得到了坏消息:坏消息,因为当我使用二进制数据文件进行序列化/非序列化时,我没有遇到这样的问题。也许内存泄漏在某个地方,但是我好像在每个步骤都重置了……abrab: SQLite是纯C,不会给出C++异常。另外,你真的需要浪费大量的内存来通过耗尽内存来获得坏的内存。错误分配的最可能原因是将无效大小传递给新[]。至于_reset,它只用于停止在重用之前返回更多行的查询,我想我从未使用过它。它甚至可能是问题的根源,因为它会丢弃该行,因此如果在执行反序列化之前调用它,反序列化会为字符串和blob列获取无效指针,为数字列获取随机数。它会在std::sting创建used new[]时崩溃。似乎我在_reset方面也有性能问题,因为在你发布答案之前,我在每个步骤中都会调用它。我认为,当我将新值绑定到准备好的语句时,有必要在每个步骤中执行此操作。非常感谢。
SELECT sid, last_access_time, last_c_time, total_c, last_viewed_lid, last_viewed_ltid FROM ssssss
"SELECT rid, lid, ltid FROM showed WHERE sid= ?1"; // sid is from first table. can be more than 1 the same sid
CREATE INDEX showed_sid ON showed (sid);