2012-03-06 38 views
5

Tôi đang chạy một thử nghiệm để so sánh bằng cách sử dụng RavenDB cho DB phụ trợ của chúng tôi so với Entity Framework với MSSQL.Vấn đề hiệu suất RavenDb?

Tôi có thiết lập ứng dụng thử nghiệm để kiểm tra xem liệu RavenDB có bất kỳ tài liệu nào trong khi khởi động hay không, nó truy vấn cơ sở dữ liệu SQL qua Entity Framework để nhận tất cả các đối tượng (khoảng 31.000 mục) và sau đó chèn chúng vào RavenDB. Phần này hoạt động như mong đợi.

Sau đó, tôi chạy thử nghiệm. Tôi truy vấn EF cho một tập hợp các bản ghi và chuyển đổi chúng thành JSON, và lặp lại cùng với Raven (nhận được cùng một tập hợp các bản ghi). Tôi mong rằng Raven sẽ nhanh hơn, vì nó được tối ưu hóa để đọc, và EF phải tham gia vào hai bảng để lấy lại dữ liệu. Nhưng đó không phải là trường hợp.

Đây là kết quả từ các thử nghiệm:

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 

Đây là đoạn mã sử dụng để chạy thử nghiệm:

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(); 
     } 

tôi đã thể hiện RavenDB chạy trên cùng một máy như máy chủ SQL .

Đây có phải là kết quả hiệu suất mong đợi không? Hoặc có điều gì đó tôi đang làm sai.

+0

Bạn có ở đâu(), OrderBy() và Take() IQueryable? Bạn có cho phép lọc xảy ra trên Raven hay bạn đang lấy lại tất cả các hàng và làm bộ lọc trong bộ nhớ? –

+0

Tôi đã ấn tượng rằng Raven sẽ áp dụng vị trí và thứ tự của tôi và tiếp nhận máy chủ. Khi điều này chạy, tôi thấy nếu tạo ra một chỉ mục tạm thời cho các vị trí và thứ tự theo mệnh đề, do đó, có vẻ như với tôi rằng nó đang chạy trên máy chủ. –

+2

Ồ, làm cho các chỉ mục đó rõ ràng nếu bạn biết bạn sẽ sử dụng chúng. Bằng cách đó bạn sẽ không đạt được hiệu suất khi tạo chúng. (Xóa một biến hiệu năng) – Rangoric

Trả lời

7

Amanda, bạn cần phải hiểu rằng bản thân nó không phải là RavenDB nhanh hơn máy chủ sql. MSSQL đã được ra trong nhiều năm và bạn có thể chắc chắn rằng nó là cực kỳ vi tối ưu hóa và giúp bạn có kết quả tốt nhất có thể trong các kịch bản chọn số lượng lớn như một trong những bạn đã hiển thị ở trên. Đây không phải là nơi RavenDB sẽ có cơ hội đánh bại một sản phẩm như MSSQL.

Tuy nhiên, mặc dù nó không phải là cơ sở dữ liệu tạo nên sự khác biệt, hầu hết thời gian, đó là các ứng dụng và chiến lược truy cập dữ liệu sẽ mang đến cho bạn sự tương đồng sét nổi tiếng.

Toàn bộ điều là về cách cơ sở dữ liệu tài liệu cho phép bạn cấu trúc dữ liệu của bạn (nguồn gốc tổng hợp, tham chiếu không chuẩn hóa, chỉ mục được phân tích trước, v.v.). Đây không phải là một cái gì đó cụ thể cho RavenDB vì bạn có thể làm những điều đó với MongoDB và CouchDB, vì vậy có lẽ sự khác biệt nội tại nhất trong số các cơ sở dữ liệu đó là, con quạ đó mang lại cho bạn trải nghiệm .NET rất dễ dàng và dễ dàng. -giao dịch nhiều tài liệu. Có rất nhiều sweetspots khác là tốt, nhưng những người thường là những người mà sẽ làm cho bạn quyết định giữa các cơ sở dữ liệu khác nhau.

+0

@amanda RavenDB là một "cơ sở dữ liệu tài liệu" và tôi nghĩ nó hoạt động hoàn hảo cho điều đó. Nếu tôi đã sử dụng RavenDB nhiều hơn thì việc sử dụng các tài liệu chỉ, tôi đoán là, để thử và thiết kế db cho hiệu năng tốt nhất, giống như bạn phải làm với SQL. Tuy nhiên, tôi sẽ không sử dụng DB cho những gì nó không được dự định, không có vấn đề làm thế nào thú vị đó là sử dụng! –

Các vấn đề liên quan