В этой части серии экспериментов по сравнению Mongo DB и MS SQL Server я буду всячески
мучать этих, не самых последних, представителей двух различных классов СУБД - NoSql
и реляционных соответственно, вставками данных.
Итак мы имеем MS SQL Server 2008R2 редакции develop и Mongo DB 2.0. Если кто хочет
воспроизвести эксперимент у себя - Вам понадобятся соответствующие дистрибутивы,
вместо develop редакции сиквела вполне сгодится бесплатный
express,
Mongo можно загрузить отсюда.
Исходники программки можно найти на GitHub по
этой ссылке,
для компиляции понадобится dbullet, кто не использует git -
качайте отдельно, для всех остальных:
Тестирование проходило на следующий машине с такой конфигурацией: Windows 7 64, Core2Duo E4500, 8GB RAM
$
git submodule init$
git submodule update
Опыт первый
Вставка большого количества мелких объектов
Для проведения измерений был создан такой простой интерфейс, который будет дополняться с каждым новым тестом:
public interface IBenchmark
{
void InsertSimpleSmallObject(SimpleSmallObject obj);
}
{
void InsertSimpleSmallObject(SimpleSmallObject obj);
}
Реализация для MsSql:
void InsertSimpleSmallObject(SimpleSmallObject
obj)
{
command.Parameters[0].Value = obj.Value;
command.Parameters[1].Value = obj.Id;
command.ExecuteNonQuery();
}
{
command.Parameters[0].Value = obj.Value;
command.Parameters[1].Value = obj.Id;
command.ExecuteNonQuery();
}
Реализация для Mongo:
void InsertSimpleSmallObject(SimpleSmallObject
obj)
{
collection.Save(typeof(SimpleSmallObject), obj);
}
{
collection.Save(typeof(SimpleSmallObject), obj);
}
Кроме того будет запуск пустой реализации метода InsertSimpleSmallObject, чтобы оценить время потраченное на создание и удаление объектов. Перед каждым запуском прогоняется сборщик мусора, а инициализация подключений к базам выполняется до начала измерений. Объекты вставляются в цикле по одной штуке. Вставлять буду объекты такой структуры:
public class SimpleSmallObject
{
public int Id { get; set; }
public string Value { get; set; }
}
{
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
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
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
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
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
Сто тысяч объектов:
На этом этапе я посчитал, что нужно присвоить сиквелу техническое поражение, но тем не менее хотелось хоть немного поднапрячь Mongo.
Итак увеличиваем количество вставок до милиона.
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
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
Милион объектов:
Inserting small objects (1000000 objects) of FakeBenchmark
Time: 00:00:01.0090577
Inserting small objects (1000000 objects) of MongoBenchmark
Time: 00:01:06.2024621
Time: 00:00:01.0090577
Inserting small objects (1000000 objects) of MongoBenchmark
Time: 00:01:06.2024621
По результатам итих тестов стало абсолютно понятно, что Mongo не оставляет ни каких шансов на победу сиквелу в плане вставки маленьких записей.
И уже сейчас можно смело говорить, что, как минимум, Mongo можно использовать там где такие операции востребованы.
Я считаю что Mongo замечательно подойдет для всякого рода журналирования и логирования.
Хотел в этой статье посравнивать и по другим видам инсертов, но статья и так получилась большой, так что постараюсь продолжить в следующий раз
2 комментария:
Условия тестов изначально не оставляли SQL Server никаких шансов :)
Условия я старался подобрать одинаковые. Но если ты про вставку говоришь, то посмотрим дальше, сможет ли скул отыграться на выборках, удаления и джойнах.
Отправить комментарий