2012-03-06 16 views
5

Estoy ejecutando una prueba para comparar usando RavenDB para nuestro back-end DB versus Entity Framework con MSSQL.¿Problema de rendimiento de RavenDb?

Tengo la configuración de la aplicación de prueba para verificar si RavenDB tiene algún documento al inicio, y si no, consulta la base de datos SQL a través de Entity Framework para obtener todos los objetos (aproximadamente 31,000 elementos) y luego insértelos en RavenDB. Esta parte está funcionando como se esperaba.

Luego ejecuto la prueba. Consulto contra EF para un conjunto de registros y los convierto en JSON, y repito lo mismo con Raven (obteniendo exactamente el mismo conjunto de registros). Esperaba que Raven fuera más rápido, ya que está optimizado para leer, y EF tiene que unirse en dos tablas para recuperar los datos. Pero ese no es el caso.

Aquí está la salida de la prueba:

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 

Aquí es el código utilizado para ejecutar la prueba:

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

He la instancia RavenDB que se ejecutan en la misma máquina que el servidor SQL .

¿Este es el rendimiento esperado? O hay algo que estoy haciendo mal.

+0

¿Está usted dónde(), OrderBy() y Take() IQueryable? ¿Está permitiendo que el filtrado suceda en Raven, o está recuperando todas las filas y haciendo el filtro en la memoria? –

+0

Tenía la impresión de que Raven aplicaría mi pedido y tomaría el servidor. Cuando esto se ejecuta, veo si creo un índice temporal para las cláusulas where y order by, por lo que me parece que se está ejecutando en el servidor. –

+2

Ah, haz esos índices explícitos si sabes que los usarás. De esta forma, no tendrás el impacto en el rendimiento al crearlos. (Elimina una variable en el rendimiento) – Rangoric

Respuesta

7

Amanda, debes entender que no es RavenDB en sí mismo el que es más rápido que el servidor SQL. MSSQL ha estado fuera durante años y puede estar seguro de que está extremadamente optimizado en cuanto a micro y le ofrece los mejores resultados posibles en escenarios de selección masiva como el que ha mostrado anteriormente. No es aquí donde RavenDB tendrá la oportunidad de vencer a un producto como MSSQL.

Sin embargo, si bien no es la base de datos lo que hace la diferencia, la mayoría de las veces, son las aplicaciones y sus estrategias de acceso a los datos las que le darán el rendimiento de rayo del que es famoso el cuervo.

Todo se trata de cómo una base de datos de documentos le permite estructurar sus datos (raíces agregadas, referencias desnormalizadas, índices precalculados, etc.). Esto no es algo específico de RavenDB, ya que puede hacer esas cosas con MongoDB y CouchDB también, por lo que probablemente la diferencia más intrínseca entre esas bases de datos es que ese cuervo le brinda una experiencia .NET muy agradable y fácil y tiene fuera de sí caja de múltiples documentos de transacciones. También hay muchos otros sweetspots, pero generalmente son los que te harán decidir entre diferentes bases de datos.

+0

@amanda RavenDB es una "base de datos de documentos" y creo que funciona perfecto para eso. Si tuviera que utilizar RavenDB para obtener más información que el uso de documentos justos, supongo que sería mejor intentar diseñar el archivo db para obtener el mejor rendimiento, al igual que con SQL. Sin embargo, no utilizaría el DB para lo que no estaba destinado, sin importar cuán emocionante sea su uso. –