主内存DB与对象DB

siv*_*udh 3 rdbms in-memory-database object-oriented-database

我目前正在尝试选择数据库供应商.

我只是在寻找其他数据库开发人员的个人意见.

我的问题特别针对那些:

1)使用了支持复制到磁盘(混合)的主内存数据库(MMDB)(即ExtremeDB)

要么

2)使用了Versant对象数据库和/或客观数据库和/或Progress ObjectStore

问题是:如果你可以根据你的经验推荐一个适合我的应用程序的数据库供应商.

我的应用程序是一个商业实时(读取:高性能)面向对象的C++ GIS类应用程序,我们需要进行大量的lat/lon搜索(即给定一个区域,找到该区域内的所有匹配目标. ..R-Tree索引).

我想要存储到数据库中的数据类型都被建模为对象,它们使用std :: list和std :: vector,所以自然,Object Database似乎有意义.我已经阅读了足够多的文章来说服自己,传统的RDBMS可能不是我真正想要的

  1. 性能(动态长度数据的连接或多个表,如列表/向量)
  2. 易于编程(阻抗不匹配)

但是,就性能而言,

  1. 输入数据以大约40 MB/s的速度馈入系统.

  2. 因此,系统也将以每秒大约350次插入的速率插入数据库(每个对象从64KB到128KB),

  3. 将始终通过多个线程搜索和更新数据库.

根据我的理解,我在这里列出的所有对象数据库都使用缓存来存储数据库对象.ExtremeDB声称,因为它专为内存而设计,它可以避免缓存逻辑等的开销.通过googling查看更多内容:主内存与RAM-Disk数据库:基于Linux的基准测试

所以..我只是有点困惑.可以在实时系统中使用对象DB吗?它是否像MMDB一样"快"?

Wil*_*ung 5

从根本上说,MMDB和OODB之间的区别在于MMDB期望它的所有数据都基于RAM,但在某些时候仍然存在于磁盘上.而OODB更传统,因为没有期望整个DB适合RAM.

MMDB可以通过放弃持久数据不一定必须"匹配"RAM数据的概念来利用这一点.

任何具有持久性的方法都是有效的,它必须以某种方式在更新时将数据写入磁盘.

几乎所有的数据库都使用某种日志.这些日志基本上是附加到文件的"原始"数据页,或者可能是单个事务.当文件"太大"时,将启动一个新文件.

将日志正确合并到主存储中后,将丢弃(或重复使用)日志.

现在,简单地通过将事务附加到日志文件就可以存在RAM DB中的原始数据,并且当它重新启动时,它只是将登录加载到RAM中.因此,实质上,日志文件是数据库.

这种技术的缺点是你拥有的事务越多越多,日志/数据库越大,因此数据库启动时间越长.但是,理想情况下,您还可以"快照"当前状态,从而消除所有日志,并有效地压缩它们.

以这种方式,DB必须管理的所有例行操作都是将页面附加到日志,而不是更新其他磁盘页面,索引页面等.理想情况下,大多数系统不需要经常"启动",也许启动时间不是问题.

因此,通过这种方式,MMDB可以比具有与磁盘不同的合同的OODB更快,从而维护日志和磁盘页面.这样,即使整个数据库适合RAM并且正确缓存,OODB也可能更慢,原因很简单,因为您在正常操作期间在日志操作之外引发磁盘操作,而MMDB则将这些操作作为"维护"发生任务,可以在停机时间和/或安静时间安排.

至于这些系统中的任何一个是否能满足您的实际性能需求,我不能说.