Проблема с производительностью RavenDb? - PullRequest
5 голосов
/ 06 марта 2012

Я запускаю тест, чтобы сравнить использование RavenDB для нашей базы данных с Entity Framework с MSSQL.

У меня есть настройка моего тестового приложения, чтобы проверить и посмотреть, есть ли в 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.

Это ожидаемые результаты производительности? Или я что-то не так делаю.

1 Ответ

7 голосов
/ 07 марта 2012

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

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

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

...