RavenDb性能问题



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

我的测试应用程序设置是为了在启动时检查RavenDB中是否有文档,如果没有,它会通过实体框架查询SQL数据库,以获取所有对象(约31000个项目),然后将它们插入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服务器在同一台机器上运行。

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

Amanda,您需要明白,RavenDB本身并不是比sql server更快的。MSSQL已经问世多年了,您可以肯定,它经过了极其微观的优化,并在批量选择场景中为您带来了最好的结果,如上面所示。这不是RavenDB有机会击败MSSQL这样的产品的地方。

然而,虽然不是数据库本身造成了差异,但大多数情况下,是应用程序及其数据访问策略将为您带来raven著名的闪电性能。

整个问题是关于文档数据库如何允许你构建数据(聚合根、非规范化引用、预计算索引等)。这不是RavenDB特有的,因为你也可以用MongoDB和CouchDB做这些事情,所以这些数据库之间最本质的区别可能是,那个raven给你一个非常好的、简单的.NET体验,并且有开箱即用的多文档事务。还有许多其他的最佳点,但这些通常会让你在不同的数据库之间做出决定。