performance - RavenDb性能问题?

标签 performance ravendb

我正在运行一个测试,以比较将RavenDB用于数据库后端与使用MSSQL的 Entity Framework 。

我有测试应用程序安装程序,用于检查RavenDB在启动时是否有任何文档,如果没有,它会通过Entity Framework查询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 Server在同一台计算机上运行。

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

最佳答案

Amanda,您需要了解不是RavenDB本身比sql server更快。 MSSQL已经问世了多年,您可以确定它已经进行了微优化,并且可以在批量选择方案(如上面显示的方案)中获得最好的结果。这不是RavenDB有机会击败像MSSQL这样的产品的地方。

但是,虽然并不是数据库本身能够发挥作用,但在大多数情况下,它是应用程序及其数据访问策略为您带来了乌鸦着名的闪电性能。

整个问题与文档数据库如何允许您构建数据(聚集的根,非规范化的引用,预计算的索引等)有关​​。这不是RavenDB特有的,因为您也可以使用MongoDB和CouchDB来做这些事情,所以这些数据库之间最内在的区别可能是,该鸦鸦为您提供了非常不错且轻松的.NET体验,并且具有盒多文档交易。也有许多其他的最佳选择,但是通常这些最佳选择将使您在不同的数据库之间做出决定。

关于performance - RavenDb性能问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9587422/

相关文章:

java - 如何使用 appstats 优化性能

c# - 查询RavenDB索引中的单独集合(WHERE IN)

node.js - Ravendb Nodejs,在 map 索引中使用Enums

java - Java中静态字符串常量所需的内存空间?

vb.net - x = x + 1与x + = 1

mysql - SQL 性能 : Which is quicker? IN() 与 JOIN

ravendb - 如何查询Ravendb文档大小

c# - RavenDB 附件

node.js - "Traditional"RavenDB一对多查询

performance - AS3在大舞台边缘表现不佳