CouchDB视图与HTTP批量提取的性能

时间:2012-07-16 18:22:25

标签: couchdb mapreduce

我有几个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]

我可以通过复杂(和hacky)的一组视图来做到这一点。或者我可以批量HTTP获取我需要的文档并使用Java进行处理。

与制作视图相比,批量HTTP提取的成本有多高?事实上,CouchDB本身不支持视图链的原因,足以避免视图解决方案吗?

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

这将提供所有世界中最好的:

  • 您将能够撰写有意义的观点。
  • 您只需将所需数据提取到Java代码中。
  • 您仍然可以在运行时获得性能优势,因为视图将被编入索引,当新数据从复制到达时,该视图将逐步更新。