与SQLite相比,Berkeley DB SQL的速度有多快?

与SQLite相比,Berkeley DB SQL的速度有多快?,sqlite,benchmarking,berkeley-db,Sqlite,Benchmarking,Berkeley Db,甲骨文最近发布。我碰巧有一个数百兆字节的SQLite数据库,它可以从“改进的性能、并发性、可伸缩性和可靠性”中受益匪浅,但Oracle的站点似乎缺乏任何改进的度量。这里有人做过一些基准测试吗?这是一个很复杂的问题。根据磁盘访问速度、内存中缓存的大小、插入与读取的数量、页面拆分、并发性等,结果会有很大的不同 总的来说,BerkeleyDB的速度非常快——我最近为一位雇主设计了一个构建的数据分析平台,该平台能够在8核x86系统上每秒插入40k个数据(同时每秒读取数千个数据),数据集在30G范围内。这

甲骨文最近发布。我碰巧有一个数百兆字节的SQLite数据库,它可以从“改进的性能、并发性、可伸缩性和可靠性”中受益匪浅,但Oracle的站点似乎缺乏任何改进的度量。这里有人做过一些基准测试吗?

这是一个很复杂的问题。根据磁盘访问速度、内存中缓存的大小、插入与读取的数量、页面拆分、并发性等,结果会有很大的不同

总的来说,BerkeleyDB的速度非常快——我最近为一位雇主设计了一个构建的数据分析平台,该平台能够在8核x86系统上每秒插入40k个数据(同时每秒读取数千个数据),数据集在30G范围内。这是完全的事务性保护

不过,这是最好的情况——有时插入可能会降至每秒2k,这取决于传入的数据和当前存储在伯克利的数据。如果磁盘I/O速度慢,缓存命中率低,或者不断扩展数据库,导致页面拆分,则性能会显著下降。为了提高特定数据集的性能,您还可以进行大量调整


总的来说,这是一个优秀的系统,但文档和知识相当贫乏。我推荐可能是目前可用的最好的参考。

我参与了BDB SQLite代码的beta评估和 我试图解决的问题是性能差异。在这一点上,, 在我找到至少一个人之前,我无法准确地发布我发现的内容 评估我的代码,运行测试,并确认我得到的数字(正在测试) 完成)。然而,我可以在这里概括,并说有一些情况下,BDB 与SQLite相比,提供了显著的性能改进,特别是在 处理涉及写并发的重载的领域

通常,有两种衡量“快速”权利的标准——(1)效率:多长时间 单个进程执行XYZ与(2)并发性需要多少次 许多进程可以每单位时间执行XYZ。BDB地址的主要问题是 并发——大规模事务处理。所以你想到了很多 写入和/或修改数据库内容的并发连接

SQLite在设计上使用数据库级锁定,因此最多有一个 一次可以在数据库中工作的编写器。因此,SQLite的事务 速率随着并发连接的数量或多或少保持不变,因此 它在写密集型应用程序中的可伸缩性实际上是由它的 效率(1)

另一方面,BDB使用页面级锁定,这允许多个写入程序 在给定时间在数据库中工作(前提是他们正在 单独的页面)。因此,BDB的利率可能会随着 因此,它的可伸缩性既是一个效率问题(1)也是一个问题 并发性(2),可以加起来

主要归结为(写)并发。BDB可以推送的测试程序集比 用于多个编写器的SQLite。所谓事务,我指的是修改 数据库(它们对只读操作有何实际帮助?)。也就是说, 对于读取并发(主要执行选择的应用程序),SQLite可以很好地运行 与BDB面对面,因为锁定不再是关键问题

至于数据集的大小,我不确定。我没有调查过 那个最终,它们都使用B树进行存储。这其中可能有一些因素 它们各自的实现需要考虑,但我没有调查过。我 知道SQLite可以优雅地处理数百MB的数据集,并且 两位数的GBs(可能比脏页映射实现更高) 已更改)

因此,如果您有一个应用程序,它使用许多连接来修改 给定的数据库和页面争用相对较低,那么BDB可以提供 显著的性能改进。但页面争用是一个关键问题 变量如果您有一个BDB数据库,其数据由 如果是单个页面,那么它的性能在所有情况下都将与SQLite相匹配 因为这里的页面级锁定实际上退化为 数据库级锁定——每个人都在为一件事争吵。但是, BDB中的页面数增加(页面争用减少),然后 最大TPS将随着并发连接数的增加而开始增加。然后 从那时起,记忆成为下一个限制因素。但那是另一回事 故事

顺便说一句,我正在写一篇关于为即将到来的人使用BDB的文章 来自SQLite

文章链接:


除了Brian提到的Berkeley DB书之外,您还可能发现以下资源非常有用:

  • 伯克利DB在线论坛可以为用户和产品开发者提供很多建议。看,
  • Berkeley DB文档集,可以找到。特别是,参考指南中有几个章节介绍了调优、性能和吞吐量

那篇文章写得怎么样了?前一阵子翻过来了。我现在没办法了。不确定何时、何地发布。下周可能会听到一些消息。以下是文章中的两份白皮书:截至2017年,我应该补充一点,事情已经发生了变化。SQLite现在具有WAL模式,允许多个写入程序。这在多大程度上缩小了差距我不确定,因为我没有运行任何测试,但它确实显著提高了SQLite的写入并发性/性能。更正:WAL支持0-N个读卡器与0-1个写卡器并发(相比之下,经典的删除日志模式支持N个读卡器或1个写卡器)