【问题标题】:Why RavenDB reads all documents in indexing process and not only collections used by index?为什么 RavenDB 在索引过程中读取所有文档,而不仅仅是索引使用的集合?
【发布时间】:2013-05-08 08:23:47
【问题描述】:

我有一个相当大的数据库,大约有 260 万个文档,其中我有两个集合,每个集合 120 万个,其余的是小集合(

另外,当使用 Smuggler 导出数据并且我只想导出一个小集合时,它会读取所有文档并且导出可能需要相当长的时间。同时使用 RavenDB Linq API 和索引的自定义应用可以在几秒钟内导出数据。

为什么 RavenDB 会这样?也许有一些配置设置可能会改变这种行为?

【问题讨论】:

  • 我希望 Raven 团队将“集合”的可选列表添加到索引定义中。如果该列表为空,则索引进程按原样工作。但是,如果定义了该列表,则索引应仅考虑该列表中的集合。它将显着提高性能,并且应该非常易于实现。我们与 Smuggler 有类似的问题。我们自己的实现是使用 Raven-Entity-Name 但带有集合过滤,并且比 Smuggler 快得多。

标签: ravendb


【解决方案1】:

RavenDB 实际上没有任何真正的“集合”概念。所有文件几乎相同。它只是查看每个文档中的Raven-Entity-Name 元数据,以确定如何将事物组合在一起,以便按类型查询并在管理工作室中显示“集合”页面。

我不确定这样做的具体理由。我认为这与文档存储使用的底层 ESENT 表有关。也许Ayende可以回答得更好。您的特定用例很好地说明了为什么它可能会有所不同。

您可以尝试的一件事是使用多个数据库。您可以将大量文档放在一个数据库中,而将其他所有文件放在另一个数据库中。当然,在索引相关文档、multi-map/reduce 或其他需要将不同类型的文档放在同一个数据库中的场景时,您可能会遇到问题。

【讨论】:

    【解决方案2】:

    似乎我的问题的答案即将出现在 RavenDB 3.0 中。 Ayende 说:

    在 RavenDB 2.x 中,您仍然需要为索引支付全价 一切,但在 RavenDB 3.0 中并非如此。我们所做的 是有效地优化流程,以便在这种情况下,我们将 预加载参与相关集合的所有文档, 并将它们直接发送到索引。

    我们通过使用 Raven/DocumentsByEntityName 索引来做到这一点。哪一个 无论如何,已经索引了数据库中的所有内容。这是一个不错的 小功能,因为它可以让我们真正利用 我们早就做过的工作。使用一个索引预填充另一个 这是一个巧妙的技巧,我很高兴。

    这里是完整的博文:http://ayende.com/blog/165923/shiny-features-in-the-depth-new-index-optimization

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-15
      相关资源
      最近更新 更多