2012-03-06 3 views
5

Я запускаю тест для сравнения с использованием RavenDB для нашего БД сервера по сравнению с Entity Framework с MSSQL.RavenDb проблема с производительностью?

У меня есть тестовое приложение, чтобы проверить, есть ли у RavenDB какие-либо документы в нем при запуске, а если нет, он запрашивает базу данных SQL через Entity Framework, чтобы получить все объекты (около 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

Вы где(), OrderBy() и Take() IQueryable? Вы разрешаете фильтрацию на Raven или возвращаете все строки и делаете фильтр в памяти? –

+0

У меня создалось впечатление, что Ворон будет применять мои приложения и заказывать их на сервере. Когда это выполняется, я вижу, если создать индекс temp для предложений where и order by, так что мне кажется, что он работает на сервере. –

+2

О, сделайте эти индексы явными, если вы знаете, что будете их использовать. Таким образом у вас не будет удара производительности при их создании. (Удаляет переменную в производительности) – Rangoric

ответ

7

Аманда, вам нужно понять, что это не RavenDB, а быстрее, чем сервер sql. MSSQL существует уже много лет, и вы можете быть уверены, что он чрезвычайно микро-оптимизирован и дает вам наилучшие результаты в сценариях массового выбора, например, вы показали выше. Это не тот случай, когда RavenDB когда-либо будет иметь шанс победить продукт, такой как MSSQL.

Однако, хотя сама база данных не имеет особого значения, большую часть времени это приложения и стратегии доступа к данным, которые принесут вам молниеносную репутацию, известную ворону.

Все дело в том, как база данных документов позволяет структурировать ваши данные (совокупные корни, денормализованные ссылки, предварительно вычисленные индексы и т. Д.). Это не что-то конкретное для RavenDB, так как вы можете делать эти вещи с MongoDB и CouchDB, так что, вероятно, самая внутренняя разница между этими базами данных заключается в том, что ворон дает вам очень хороший и легкий опыт .NET и имеет вне -box с несколькими документами. Есть много других sweetspots, но, как правило, это те, которые сделают вам выбор между различными базами данных.

+0

@amanda RavenDB - это «база данных документов», и я думаю, что она идеально подходит для этого. Если бы я использовал RavenDB для более того, чем использовать только документы, я бы предположил, что попытаться создать db для лучшей производительности, как и с SQL. Тем не менее, я бы не использовал БД для того, для чего он не предназначался, независимо от того, насколько интересно это использовать! –

Смежные вопросы