2012-03-06 63 views
5

我正在运行一个测试来比较我们的数据库后端与使用MSSQL的实体框架的RavenDB。RavenDb性能问题?

我有我的测试应用程序设置来检查并看看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服务器。

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

+0

Are你Where(),OrderBy()和Take()IQueryable?你是否让过滤发生在Raven上,或者你是否恢复了所有行并在内存中执行过滤器? – 2012-03-06 16:46:40

+0

我的印象是,Raven会将我的位置和顺序应用到服务器上。当它运行时,我会看到是否为where和order by子句创建临时索引,因此在我看来它正在服务器上运行。 – 2012-03-06 18:00:40

+2

噢,如果你知道你会使用它们,那么明确这些索引。这样你就不会有创建它们的性能。 (删除性能变量) – Rangoric 2012-03-06 18:32:21

回答

7

阿曼达,你需要明白,它不是RavenDB本身比sql server更快。 MSSQL已经出现多年了,你可以肯定它是非常微型优化的,并且可以在批量选择场景中获得最佳效果,例如上面显示的场景。这不是RavenDB将有机会击败像MSSQL这样的产品的地方。然而,虽然数据库本身并不是数据库本身的重要组成部分,但大多数情况下,应用程序及其数据访问策略会为您带来乌鸦闻名的雷电性能。

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

+0

@amanda RavenDB是一个“文档数据库”,我认为它适用于此。如果我要使用RavenDB进行更多的文档使用,我的猜测是,尝试设计数据库以获得最佳性能,就像您必须使用SQL一样。尽管如此,我不会使用数据库,因为它不是用来做什么的,不管它使用多么令人兴奋! – 2012-04-27 18:23:46