【问题标题】:RavenDb performance issue?RavenDb 性能问题?
【发布时间】:2012-03-07 08:49:57
【问题描述】:

我正在运行一项测试,以比较将 RavenDB 用于我们的数据库后端与使用 MSSQL 的实体框架。

我有我的测试应用程序设置来检查 RavenDB 在启动时是否有任何文档,如果没有,它会通过实体框架查询 SQL 数据库以获取所有对象(大约 31,000 个项目),然后将它们插入 RavenDB。这部分按预期工作。

然后我运行测试。我针对 EF 查询一组记录并将它们转换为 JSON,并用 Raven 重复相同的操作(获得完全相同的记录集)。我预计 Raven 会更快,因为它针对读取进行了优化,并且 EF 必须加入两个表才能取回数据。但事实并非如此。

这是测试的输出:

Entity Framework with MS SQL    RavenDB Percent Difference Raven to EF
796.8954 ms (862 records)   1703.1686 ms (862 records)  213.725490196078
296.8826 ms (862 records)   796.8954 ms (862 records)   268.421052631579
281.2572 ms (862 records)   781.27 ms (862 records) 277.777777777778
281.2572 ms (862 records)   796.8954 ms (862 records)   283.333333333333
296.8826 ms (862 records)   765.6446 ms (862 records)   257.894736842105
312.508 ms (862 records)    765.6446 ms (862 records)   245
296.8826 ms (862 records)   750.0192 ms (862 records)   252.631578947368
296.8826 ms (862 records)   750.0192 ms (862 records)   252.631578947368
359.3842 ms (862 records)   765.6446 ms (862 records)   213.04347826087
281.2572 ms (862 records)   765.6446 ms (862 records)   272.222222222222
281.2572 ms (862 records)   796.8954 ms (862 records)   283.333333333333
281.2572 ms (862 records)   765.6446 ms (862 records)   272.222222222222
281.2572 ms (862 records)   812.5208 ms (862 records)   288.888888888889
265.6318 ms (862 records)   781.27 ms (862 records) 294.117647058824
296.8826 ms (862 records)   796.8954 ms (862 records)   268.421052631579
281.2572 ms (862 records)   765.6446 ms (862 records)   272.222222222222
281.2572 ms (862 records)   828.1462 ms (862 records)   294.444444444444
281.2572 ms (862 records)   781.27 ms (862 records) 277.777777777778
328.1334 ms (862 records)   750.0192 ms (862 records)   228.571428571429
296.8826 ms (862 records)   750.0192 ms (862 records)   252.631578947368
312.508 ms (862 records)    781.27 ms (862 records) 250
296.8826 ms (862 records)   796.8954 ms (862 records)   268.421052631579
281.2572 ms (862 records)   765.6446 ms (862 records)   272.222222222222
312.508 ms (862 records)    781.27 ms (862 records) 250
281.2572 ms (862 records)   734.3938 ms (862 records)   261.111111111111

这是用于运行测试的代码:

protected void Page_Load(object sender, EventArgs e)
        {

            int totalTests = 25;


            DataTable dt = new DataTable();
            dt.Columns.Add("Entity Framework with MS SQL");
            dt.Columns.Add("RavenDB");
            dt.Columns.Add("Percent Difference Raven to EF");

            for (int i = 1; i <= totalTests; i++)
            {

                string efMilliseconds = string.Empty;
                string ravenMilliseconds = string.Empty;

                double efMS = 0;
                double ravenMS = 0;

                // EF
                using (tamcEntitiesForRavenTest myObjectContext = new tamcEntitiesForRavenTest())
                {
                    DateTime startTime = DateTime.Now;
                    List<Treatment> efTreatments = myObjectContext.Treatments.Include("Segments").Where(x => x.Jurisdiction == "00145").OrderBy(x => x.Treatment_Date).ToList();
                    string json = JsonConvert.SerializeObject(efTreatments);
                    TimeSpan TotalTime = DateTime.Now - startTime;
                    efMS = TotalTime.TotalMilliseconds;
                    efMilliseconds = string.Format("{0} ms ({1} records)", efMS.ToString(), efTreatments.Count);
                }

                // Raven
                using (var session = DataDocumentStore.Instance.OpenSession())
                {
                    DateTime startTime = DateTime.Now;
                    List<RavenTreatment> ravenTreatments = session.Query<RavenTreatment>().Where(x => x.Jurisdiction == "00145").OrderBy(x => x.Treatment_Date).Take(1000).ToList();
                    string json = JsonConvert.SerializeObject(ravenTreatments);
                    TimeSpan TotalTime = DateTime.Now - startTime;
                    ravenMS = TotalTime.TotalMilliseconds;
                    ravenMilliseconds = string.Format("{0} ms ({1} records)", ravenMS.ToString(), ravenTreatments.Count);
                }

                DataRow dr = dt.NewRow();
                dr[0] = efMilliseconds;
                dr[1] = ravenMilliseconds;
                double percentDifference = (ravenMS * 100) / efMS;
                dr[2] = percentDifference;

                dt.Rows.Add(dr);
            }

            GridView1.DataSource = dt;
            GridView1.DataBind();
        }

我的 RavenDB 实例与 SQL 服务器在同一台机器上运行。

这是预期的性能结果吗?还是我做错了什么。

【问题讨论】:

  • 你是 Where()、OrderBy() 和 Take() IQueryable 吗?你是让过滤发生在 Raven 上,还是取回所有行并在内存中进行过滤?
  • 我的印象是 Raven 会应用我的 where 和 order by 并接管服务器。当它运行时,我会查看是否为 where 和 order by 子句创建临时索引,所以在我看来它正在服务器上运行。
  • 哦,如果你知道你会使用这些索引,请明确说明它们。这样你就不会因为创建它们而受到性能影响。 (删除性能变量)

标签: performance ravendb


【解决方案1】:

Amanda,你要明白,不是 RavenDB 本身比 sql server 快。 MSSQL 已经问世多年,您可以确定它经过了极大的优化,并且可以在像上面显示的那样的批量选择场景中为您提供可能的最佳结果。这不是 RavenDB 有机会击败像 MSSQL 这样的产品的地方。

然而,虽然数据库本身并不重要,但在大多数情况下,应用程序及其数据访问策略将为您带来 raven 著名的闪电般的性能。

整个事情是关于文档数据库如何允许您构建数据(聚合根、非规范化引用、预计算索引等)。这不是 RavenDB 特有的东西,因为您也可以使用 MongoDB 和 CouchDB 来做这些事情,所以这些数据库之间最本质的区别可能是,raven 为您提供了非常好的和简单的 .NET 体验,并且具有不合时宜的-box 多文档交易。还有许多其他的甜蜜点,但这些通常会让您在不同的数据库之间做出决定。

【讨论】:

  • @amanda RavenDB 是一个“文档数据库”,我认为它非常适合这一点。如果我将 RavenDB 用于更多而不是仅使用文档,我的猜测是,尝试设计数据库以获得最佳性能,就像你必须使用 SQL 一样。尽管如此,我不会将数据库用于它不适合的用途,无论它使用起来多么令人兴奋!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
相关资源
最近更新 更多