【问题标题】:Project using RavenDB builds very slowly. Am I doing something wrong?使用 RavenDB 的项目构建非常缓慢。难道我做错了什么?
【发布时间】:2012-03-23 14:06:26
【问题描述】:

我正在开发一个内置于 asp.net mvc 4 的新开源 CMS。这是一个个人项目,主要是为了提高我的技能并尝试学习 RavenDB。我最初首先使用 EF Code 和 Sql 精简版开始构建它。然后我开始学习 RavenDB,所以我直接进入并一直在将数据存储重新设计为 RavenDB。但是,我注意到,随着我越来越深入地了解它,我的解决方案和项目在 Visual Studio 中构建的时间越来越长,在初始网站启动时运行的时间也越来越长。使用 EF 和 SQL CE 时情况并非如此。我知道应用程序开始加载新的文档存储并创建索引有很大的影响,但是当我添加更多索引时,它似乎花费的时间越来越长,我不明白这会如何减慢实际解决方案文件的构建。我在想也许我在这里做错了什么。我正在使用 asp.net mvc 4 和 RavenDB build 700。

我想知道这是否与我的索引有关,因为它是从我开始向我的项目中添加索引时开始的。也许我创建错误或编码错误???这是我创建索引时的代码,以及几个索引示例。

// Register RavenDB Indexes
IndexCreation.CreateIndexes(typeof(Posts_BySlug).Assembly, Store);
IndexCreation.CreateIndexes(typeof(Posts_ByCategorySlug).Assembly, Store);
IndexCreation.CreateIndexes(typeof(Categories_BySlug).Assembly, Store);
IndexCreation.CreateIndexes(typeof(PostTypes_BySlug).Assembly, Store);
IndexCreation.CreateIndexes(typeof(Accounts_ByEmail).Assembly, Store);
IndexCreation.CreateIndexes(typeof(Settings_ByName).Assembly, Store);
IndexCreation.CreateIndexes(typeof(Posts_ByParentID).Assembly, Store);

这是我的几个索引。我现在只有一个 Map/Reduce,其余的只是使用 Maps。

public class Posts_ByParentID : AbstractIndexCreationTask<Post>
{
    public Posts_ByParentID()
    {
        Map = posts => from post in posts
                       select new { ParentID = post.ParentID, Status = post.Status };
    }
}


public class PostTypes_BySlug : AbstractIndexCreationTask<PostType>
{
    public PostTypes_BySlug()
    {
        Map = postTypes => from postType in postTypes
                           select new { Slug = postType.Slug };
    }
}

就您所见,非常基本的索引。目前我只有9个。项目加载后,我在任何地方运行,每个请求主要运行 1 个查询,后端运行 1-3 个。总响应时间都低于 1 秒。只是初始应用程序启动可能需要长达 45 秒,解决方案构建时间长达 45 秒,而过去使用 EF 时需要 5 秒。我只是不想让它变得更糟。我还注意到,如果我的网站空闲 5-10 分钟,那么当我请求新页面时,又需要 30-45 秒才能响应。有什么想法吗?

抱歉,帖子太长了。感谢您的帮助。

【问题讨论】:

  • 所有索引都在单独的程序集中吗?如果没有,那么您只需要其中一个 CreateIndexes 调用,它会搜索传入程序集中定义的所有索引并全部创建。
  • 不,它们都在同一个程序集和命名空间中。这是有道理的,因为当我运行命令行服务器并查看 ravendb 日志时,我确实注意到,我可以看到索引被创建了多次,但我不知道它是这样工作的。谢谢,我会接听额外的电话。
  • 下一个问题是您是否有任何自定义构建步骤,例如剃须刀编译或在构建时运行单元测试?
  • 我注释掉了除了一个索引创建调用之外的所有调用,并且 application_start 现在更快了。感谢那!我仍然有很长的解决方案构建时间。我注意到只有当我选择“重建解决方案”而不是当我只做“构建解决方案”时。我最近一直在使用 Build,但我过去总是进行重建。不过,我可能从来没有真正需要过。
  • 不,没有 razor 或查看编译,也没有运行单元测试。我没有设置任何类型的构建脚本。我从没有单元测试的基本 MVC 4 Web 应用程序解决方案开始,并且没有在构建过程中添加任何其他内容。如果我只是做一个构建它真的很快。我想我将在开发过程中从现在开始停止使用重建

标签: visual-studio visual-studio-2010 ravendb


【解决方案1】:

将部分答案移出评论线程。仍然不确定构建时间,但就索引创建而言......

您只需调用一次 CreateIndexes()。您将一个对整个程序集的引用传递给它,它会扫描程序集中包含的所有索引并全部创建它们。
您发布的代码将创建每个索引 7 次。

【讨论】:

  • 是的,在再次查看日志之后,这正是它正在做的事情。我将其更改为仅第一次调用,并且加载速度更快。就像我提到的,我现在只使用“Build”而不是 Rebuild,而且速度也很快。所以看来我的问题现在已经解决了。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
相关资源
最近更新 更多