четверг, 6 октября 2011 г.

Mongo vs MsSql часть вторая - insert


В этой части серии экспериментов по сравнению Mongo DB и MS SQL Server я буду всячески мучать этих, не самых последних, представителей двух различных классов СУБД - NoSql и реляционных соответственно, вставками данных.
Итак мы имеем MS SQL Server 2008R2 редакции develop и Mongo DB 2.0. Если кто хочет воспроизвести эксперимент у себя - Вам понадобятся соответствующие дистрибутивы, вместо develop редакции сиквела вполне сгодится бесплатный express, Mongo можно загрузить отсюда. Исходники программки можно найти на GitHub по этой ссылке, для компиляции понадобится dbullet, кто не использует git - качайте отдельно, для всех остальных:
$
git submodule init
$
git submodule update
Тестирование проходило на следующий машине с такой конфигурацией: Windows 7 64, Core2Duo E4500, 8GB RAM

Опыт первый

Вставка большого количества мелких объектов

Для проведения измерений был создан такой простой интерфейс, который будет дополняться с каждым новым тестом:

public interface IBenchmark
{
  void InsertSimpleSmallObject(SimpleSmallObject obj);
}

Реализация для MsSql:

void InsertSimpleSmallObject(SimpleSmallObject obj)
{
  command.Parameters[0].Value = obj.Value;
  command.Parameters[1].Value = obj.Id;
  command.ExecuteNonQuery();
}

Реализация для Mongo:

void InsertSimpleSmallObject(SimpleSmallObject obj)
{
  collection.Save(typeof(SimpleSmallObject), obj);
}

Кроме того будет запуск пустой реализации метода InsertSimpleSmallObject, чтобы оценить время потраченное на создание и удаление объектов. Перед каждым запуском прогоняется сборщик мусора, а инициализация подключений к базам выполняется до начала измерений. Объекты вставляются в цикле по одной штуке. Вставлять буду объекты такой структуры:

public class SimpleSmallObject
{
  public int Id { get; set; }
  public string Value { get; set; }
}

В качестве Value используется Guid.

Одна тысяча объектов:
Inserting small objects (1000 objects) of FakeBenchmark
Time: 00:00:00.0020001
Inserting small objects (1000 objects) of SqlServerBenchmark
Time: 00:00:03.5131987
Inserting small objects (1000 objects) of MongoBenchmark
Time: 00:00:00.1380078
Пять тысяч объектов:
Inserting small objects (5000 objects) of FakeBenchmark
Time: 00:00:00.0050003
Inserting small objects (5000 objects) of SqlServerBenchmark
Time: 00:00:15.9469122
Inserting small objects (5000 objects) of MongoBenchmark
Time: 00:00:00.2690154
Десять тысяч объектов:
Inserting small objects (10000 objects) of FakeBenchmark
Time: 00:00:00.0110006
Inserting small objects (10000 objects) of SqlServerBenchmark
Time: 00:00:31.7717581
Inserting small objects (10000 objects) of MongoBenchmark
Time: 00:00:00.6260358
Семьдесятпять тысяч объектов:
Inserting small objects (75000 objects) of FakeBenchmark
Time: 00:00:00.0800001
Inserting small objects (75000 objects) of SqlServerBenchmark
Time: 00:04:06.5806614
Inserting small objects (75000 objects) of MongoBenchmark
Time: 00:00:03.7390576
Сто тысяч объектов:
Inserting small objects (100000 objects) of FakeBenchmark
Time: 00:00:00.1030037
Inserting small objects (100000 objects) of SqlServerBenchmark
Time: 00:05:33.3390749
Inserting small objects (100000 objects) of MongoBenchmark
Time: 00:00:05.6952817
На этом этапе я посчитал, что нужно присвоить сиквелу техническое поражение, но тем не менее хотелось хоть немного поднапрячь Mongo. Итак увеличиваем количество вставок до милиона.
Милион объектов:
Inserting small objects (1000000 objects) of FakeBenchmark
Time: 00:00:01.0090577
Inserting small objects (1000000 objects) of MongoBenchmark
Time: 00:01:06.2024621

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

Хотел в этой статье посравнивать и по другим видам инсертов, но статья и так получилась большой, так что постараюсь продолжить в следующий раз

2 комментария:

Unknown комментирует...

Условия тестов изначально не оставляли SQL Server никаких шансов :)

Семён Кирюшин комментирует...

Условия я старался подобрать одинаковые. Но если ты про вставку говоришь, то посмотрим дальше, сможет ли скул отыграться на выборках, удаления и джойнах.