视图与HTTP大容量获取的CouchDB性能



我有几个CouchDB数据库,都有数百GB,我需要以依赖于多个数据库的方式从中获取文档,例如(伪代码,前缀表示文档来自哪个数据库):

for each Db1_Document in Db1
    if Db1_Document has field "Db2_match"
        Db2_Document = Db1_Document.Db2_match
        for each Db2_Reference in Db2_Document.references
            if Db2_Reference has empty field "Db1_match"
                add Db2_Reference to List bigList
        emit [Db2_Document, bigList]

我可以用一套复杂的(而且很粗糙的)观点来做这件事。或者,我可以批量HTTP获取我需要的文档,并用Java进行处理。

与生成视图相比,批量HTTP获取的成本有多高?CouchDB本身不支持视图链接这一事实是否足以避免视图解决方案?

这是一个效率非常高的应用程序。

在Couch中创建视图是I/O和CPU密集型的,尤其是因为它会影响实例中的所有文档。

如果您的逻辑影响所有文档,那么创建视图可能是最有效的机制。如果您已经有了一个相当粗略的视图,它为您提供了处理所需的子集(或子集的超集,但小于整个DB),那么最好简单地提取您需要的子集并在本地进行处理。

您可能会发现创建一个新的数据库更容易/更好,该数据库使用过滤复制将其他数据库中的所有信息拉入另一个数据库。然后对另一个数据库进行查询。您的数据会有点过时,但将所有相关数据放在一个DB中的优势将使您可以编写一个可以查看所有相关文档的视图。因此,随着新文档从复制步骤到达,该视图将被增量索引和更新。

这将提供最好的世界:

  • 你将能够写出有意义的观点
  • 您将只将所需的数据提取到Java代码中
  • 您仍然可以在运行时获得性能优势,因为视图将被索引,随着新数据从复制中到达,视图将被增量更新

最新更新