【发布时间】:2017-09-23 19:20:05
【问题描述】:
我对 SQLite 有疑问。似乎每次调用都需要大约 300 毫秒才能执行。经过一些测试,我注意到延迟是由事务引起的。 8 次带有隐式事务的普通插入大约需要 2 秒,但是,如果我在插入之前启动事务并在之后提交,我可以同时进行近一百万次插入。受影响的调用包括 DROP TABLE、CREATE TABLE、INSERT,我假设还有其他调用(可能所有隐式开始事务的调用)。
更多信息:
- 从 SQLite 网站 (3200100) 下载源合并
- 使用 Visual Studio 将其编译为静态库(未使用任何编译器标志,尽管我一直在玩弄它们但没有运气)
- 我使用 sqlite3_open16,然后是 sqlite3_prepare16_v3,然后是 sqlite3_step 开始执行和/或接收第一个结果
- 没有多线程,没有多进程访问,数据库文件被这个程序独占打开
- 如果我在我的 SSD (960 EVO) 上创建文件,则“事务延迟”会从 300 毫秒降至 10 毫秒。虽然仍然是一个荒谬的高价值,但我觉得我的磁盘速度不应该影响任何减慢交易速度的因素?
- 阻塞的函数是 sqlite3_step(例如,我必须调用具有该名称的函数来执行 DROP TABLE,这也让我很恼火,但这并不重要)
- 编辑:在事务期间,CPU 使用率为 100%。
顺便说一句,如果您知道表的每一行都是 64 字节,是否可以“帮助”SQLite 组织数据?
我希望您能帮助我解决这个问题,或者可能推荐一个替代方案(关系型、c++ api、基于文件、高性能) 非常感谢!
【问题讨论】:
-
DROP 和 CREATE TABLE 可能非常昂贵,因为除非创建新数据库或对现有数据库模式进行复杂升级,否则执行这两个命令是不常见的。 DROP/CREATE 还必须对数据库元数据(模式)进行大量更改/检查。除非表上有很多索引/外键,否则 INSERT 应该很快。
标签: c++ database performance sqlite transactions