2012-03-06 19 views
5

Sto eseguendo un test per confrontare usando RavenDB per il nostro DB backend contro Entity Framework con MSSQL.Problema di prestazioni RavenDb?

Ho installato la mia app di test per verificare se RavenDB ha documenti al suo interno all'avvio e, in caso contrario, interroga il database SQL tramite Entity Framework per ottenere tutti gli oggetti (circa 31.000 elementi) e quindi inserirli nel RavenDB. Questa parte funziona come previsto.

Quindi eseguo il test. Eseguo una query su EF per un set di record e li converto in JSON, e ripeto lo stesso con Raven (ottenendo lo stesso identico insieme di record). Mi aspettavo che Raven sarebbe stato più veloce, dal momento che è ottimizzato per la lettura, e EF deve unirsi su due tabelle per recuperare i dati. Ma non è questo il caso.

Ecco l'uscita dal test:

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 

Ecco il codice utilizzato per eseguire il test:

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

ho l'istanza RavenDB in esecuzione sulla stessa macchina del server SQL .

Si tratta dei risultati prestazionali previsti? O c'è qualcosa che sto sbagliando.

+0

Sei dove(), OrderBy() e Take() IQueryable? Stai lasciando che il filtraggio avvenga su Raven, o stai recuperando tutte le righe e facendo il filtro in memoria? –

+0

Avevo l'impressione che Raven applicasse il mio ordine e il mio da prendere sul server. Quando viene eseguito, vedo se creare un indice temporaneo per le clausole where e order by, quindi mi sembra che sia in esecuzione sul server. –

+2

Oh, rendi espliciti quegli indici se sai che li userai. In questo modo non avrai il successo della tua creazione. (Rimuove una variabile in termini di prestazioni) – Rangoric

risposta

7

Amanda, è necessario capire che non è RavenDB stesso che è più veloce di SQL Server. MSSQL è stato fuori per anni e puoi essere sicuro che è estremamente micro-ottimizzato e ti offre i migliori risultati possibili in scenari di selezione di massa come quello che hai mostrato sopra. Non è qui che RavenDB avrà mai la possibilità di battere un prodotto come MSSQL.

Tuttavia, mentre non è il database stesso a fare la differenza, il più delle volte, sono le applicazioni e le sue strategie di accesso ai dati che ti porteranno le prestazioni lampo di cui è famoso il corvo.

Il tutto riguarda il modo in cui un database di documenti consente di strutturare i dati (radici aggregate, riferimenti denormalizzati, indici precompilati, ecc.). Questo non è qualcosa di specifico per RavenDB, dato che puoi fare anche quelle cose con MongoDB e CouchDB, quindi probabilmente la differenza più intrinseca tra quei database è che il corvo ti offre un'esperienza .NET molto piacevole e facile e ha un out-of-the -box transazioni multi documento. Ci sono anche molti altri sweetspot, ma quelli sono generalmente quelli che ti faranno decidere tra diversi database.

+0

@amanda RavenDB è un "database di documenti" e penso che funzioni perfettamente per questo. Se dovessi usare RavenDB per qualcosa in più dell'uso di solo documenti, la mia ipotesi sarebbe, per provare a progettare il db per le migliori prestazioni, proprio come devi fare con SQL. Tuttavia, non userei il DB per ciò a cui non era destinato, non importa quanto sia eccitante da usare! –

Problemi correlati