2012-03-06 16 views
5

Przeprowadzam test do porównania przy użyciu RavenDB dla naszego backendu DB versus Entity Framework z MSSQL.Problem z wydajnością RavenDb?

Mam ustawienia mojej aplikacji testowej, aby sprawdzić i sprawdzić, czy RavenDB ma jakiekolwiek dokumenty w nim przy starcie, a jeśli nie, to wysyła zapytanie do bazy danych SQL poprzez Entity Framework, aby uzyskać wszystkie obiekty (około 31 000 pozycji) i następnie wstaw je do RavenDB. Ta część działa zgodnie z oczekiwaniami.

Następnie uruchamiam test. Pytam o EF dla zestawu rekordów i konwertuję je na JSON i powtarzam to samo z Ravenem (otrzymuję dokładnie ten sam zestaw rekordów). Spodziewałem się, że Raven będzie szybszy, ponieważ jest zoptymalizowany do czytania, a EF musi dołączyć do dwóch stołów, aby odzyskać dane. Ale tak nie jest.

Oto wynik z testu:

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 

Oto kod wykorzystywany do przeprowadzenia testu:

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

I instancja RavenDB działa na tej samej maszynie co serwer SQL .

Czy to oczekiwane wyniki? Czy jest coś, co robię źle.

+0

Czy jesteś IQueryable Where(), OrderBy() i Take()? Czy pozwalasz filtrować na Raven, czy też wracasz do wszystkich wierszy i robisz filtr w pamięci? –

+0

Miałem wrażenie, że Raven zastosuje moje miejsce i porządek i przejmie serwer. Po uruchomieniu widzę, jeśli utworzę indeks temp dla klauzul where i order by, więc wydaje mi się, że działa on na serwerze. –

+2

Och, wyraź te indeksy, jeśli wiesz, że będziesz ich używać. W ten sposób nie będziesz mieć wydajności, jaką można uzyskać, tworząc je. (Usuwa zmienną z wydajności) – Rangoric

Odpowiedz

7

Amanda, musisz zrozumieć, że to nie sam RavenDB jest szybszy niż serwer sql. MSSQL jest dostępny od wielu lat i możesz mieć pewność, że jest on bardzo zoptymalizowany pod kątem mikrooptymalizacji i zapewnia najlepsze możliwe wyniki w scenariuszach zbiorczego wyboru, takich jak ten, który pokazano powyżej. To nie jest miejsce, w którym RavenDB kiedykolwiek będzie miał szansę na pokonanie produktu takiego jak MSSQL.

Jednak mimo że sama baza danych nie robi różnicy, większość aplikacji i strategii dostępu do danych pozwala uzyskać błyskawiczny efekt, z którego słynie kruk.

Cała sprawa dotyczy tego, w jaki sposób baza danych dokumentów umożliwia strukturowanie danych (zagregowane źródła, zdenormalizowane odwołania, wstępnie obliczone indeksy itp.). To nie jest coś szczególnego dla RavenDB, ponieważ możesz robić te rzeczy również z MongoDB i CouchDB, więc prawdopodobnie najbardziej istotną różnicą pomiędzy tymi bazami danych jest to, że kruk daje ci bardzo ładne i łatwe doświadczenie .NET i ma poza tym -box transakcje wielu dokumentów. Istnieje również wiele innych "słodkich" punktów, ale zazwyczaj są to te, które decydują o wyborze różnych baz danych.

+0

@amanda RavenDB to "baza danych dokumentów" i myślę, że działa idealnie. Gdybym używał RavenDB do więcej niż używania tylko dokumentów, zgaduję, żebym spróbował zaprojektować db dla najlepszej wydajności, podobnie jak z SQL. Niemniej jednak nie użyłbym DB do tego, do czego nie był przeznaczony, bez względu na to, jak ekscytujący jest ten użytek! –

Powiązane problemy