Это третья по счету статья из серии серии, где я пытаюсь сравнить две СУБД Mongo DB и MS SQL.
Вот предыдущие части: первая
и вторая.
Исходники по прежнему лежат на GitHub, а это прямая ссылка на тег с текущим экспериментом.
Прошлый раз я забыл сказать, если кто захочет повторить эксперимент у себя, то нужно заменить
строку подключения к базе сиквела в классе SqlServerBenchmark (да знаю для этого есть конфиги, но пофиг).
База годится любая, но лучше завести чистую :) Все операции по подготовке базы (создание таблиц и их чистка)
берет на себя dbullet. Так что для запуска достаточно прописать строку подключения.
Так же немного поменялась конфигурация машины на которой будут проходить эксперименты,
теперь это Core2Quad Q6600, 4GB RAM софтверные составляющие не поменялись, и это по прежнему Windows 7 x64,
MS SQL Server 2008R2 develop и Mongo DB 2.0.
На этот раз я буду добавлять в базу объекты более приближенные к реальным условиям,
чем предыдущий раз:
MotleyObject
public class MotleyObject
{
public int Id { get; set; }
public DateTime Date { get; set; }
public Guid Guid { get; set; }
public bool Flag { get; set; }
public string Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }
public string Field4 { get; set; }
public string Field5 { get; set; }
public string Field6 { get; set; }
public string Field7 { get; set; }
public string Field8 { get; set; }
public DateTime Date1 { get; set; }
public Guid Guid1 { get; set; }
public bool Flag1 { get; set; }
public string Field11 { get; set; }
public string Field21 { get; set; }
public string Field31 { get; set; }
public string Field41 { get; set; }
public string Field51 { get; set; }
public string Field61 { get; set; }
public string Field71 { get; set; }
public string Field81 { get; set; }
}
То есть, объект состоит из кучи полей, как это обычно бывает в реальных приложениях.
Количество записей для вставки по прежнему 1000, 5000, 10000, 75000 и 100000, а для Mongo еще и 1000000 в нагрузочку.
Также немного переработан механизм запуска, теперь все тесты выполняются за один запуск.
Результаты
Таблица MotleyObject удалена
Таблица SimpleSmallObject удалена
Таблица SimpleSmallObject создана в разделе PRIMARY
Таблица MotleyObject создана в разделе PRIMARY
----------------------------------------------------------
Inserting motley objects (1000 objects) of FakeBenchmark
Time: 00:00:00.0210012
Inserting motley objects (1000 objects) of SqlServerBenchmark
Time: 00:00:03.4231936
Inserting motley objects (1000 objects) of MongoBenchmark
Time: 00:00:00.2198094
----------------------------------------------------------
Таблица MotleyObject удалена
Таблица SimpleSmallObject удалена
Таблица SimpleSmallObject создана в разделе PRIMARY
Таблица MotleyObject создана в разделе PRIMARY
----------------------------------------------------------
Inserting motley objects (5000 objects) of FakeBenchmark
Time: 00:00:00.0900052
Inserting motley objects (5000 objects) of SqlServerBenchmark
Time: 00:00:16.7795167
Inserting motley objects (5000 objects) of MongoBenchmark
Time: 00:00:00.6310266
----------------------------------------------------------
Таблица MotleyObject удалена
Таблица SimpleSmallObject удалена
Таблица SimpleSmallObject создана в разделе PRIMARY
Таблица MotleyObject создана в разделе PRIMARY
----------------------------------------------------------
Inserting motley objects (10000 objects) of FakeBenchmark
Time: 00:00:00.1810104
Inserting motley objects (10000 objects) of SqlServerBenchmark
Time: 00:00:33.6224523
Inserting motley objects (10000 objects) of MongoBenchmark
Time: 00:00:01.2158664
----------------------------------------------------------
Таблица MotleyObject удалена
Таблица SimpleSmallObject удалена
Таблица SimpleSmallObject создана в разделе PRIMARY
Таблица MotleyObject создана в разделе PRIMARY
----------------------------------------------------------
Inserting motley objects (75000 objects) of FakeBenchmark
Time: 00:00:01.3810751
Inserting motley objects (75000 objects) of SqlServerBenchmark
Time: 00:04:26.5374507
Inserting motley objects (75000 objects) of MongoBenchmark
Time: 00:00:11.6944083
----------------------------------------------------------
Таблица MotleyObject удалена
Таблица SimpleSmallObject удалена
Таблица SimpleSmallObject создана в разделе PRIMARY
Таблица MotleyObject создана в разделе PRIMARY
----------------------------------------------------------
Inserting motley objects (100000 objects) of FakeBenchmark
Time: 00:00:02.1685206
Inserting motley objects (100000 objects) of SqlServerBenchmark
Time: 00:06:08.3140685
Inserting motley objects (100000 objects) of MongoBenchmark
Time: 00:00:14.8089441
----------------------------------------------------------
Inserting motley objects (1000000 objects) of FakeBenchmark
Time: 00:00:18.1328569
Inserting motley objects (1000000 objects) of MongoBenchmark
Time: 00:02:03.8559178
Как и следовало ожидать на подобных объектах Mongo опять в пух и прах разнес сиквел.
А вот следующий эксперимент оказался совсем не таким однозначным, как показалось сначала. Суть такова: берем
большие объекты такой структуры
BigFatObject
public class BigFatObject
{
public int Id { get; set; }
public string Text1 { get; set; }
public string Text2 { get; set; }
public string Text3 { get; set; }
public string Text4 { get; set; }
}
При вставке каждое из текстовых полей забивается четырьмя тысячам символов, это где-то 4000*4*2=32000 байт и вставляется как и раньше.
Исходники как всегда на Гитхабе - ссылка на тег эксперимета
Сначала все происходило как и ожидалось, то есть Mongo обгонял как и раньше.
Но вот на миллионе записей Mongo начал вести себя несколько странновато - во первых он съел всю память, которую мог съесть (больше 2ГБ, своп отключен).
А дальше стало происходить вообще странное - он забил почти весь диск, на которой лежали файлы базы, что-то около 26ГБ. Работал он долго, но не упал - все перемолол.
Ну на самом деле как то так и получается 32000*1000000/1024/1024/1024 = 29,8ГБ. И эти почти тридцать гигов он перелопатил за 12 минут, молодец в общем (винт SSD).
Результаты
----------------------------------------------------------
Таблица BigFatObject удалена
Таблица MotleyObject удалена
Таблица SimpleSmallObject удалена
Таблица SimpleSmallObject создана в разделе PRIMARY
Таблица MotleyObject создана в разделе PRIMARY
Таблица BigFatObject создана в разделе PRIMARY
----------------------------------------------------------
Inserting big fat objects (1000 objects) of FakeBenchmark
Time: 00:00:00
Inserting big fat objects (1000 objects) of SqlServerBenchmark
Time: 00:00:04.0652325
Inserting big fat objects (1000 objects) of MongoBenchmark
Time: 00:00:00.1870107
----------------------------------------------------------
Таблица BigFatObject удалена
Таблица MotleyObject удалена
Таблица SimpleSmallObject удалена
Таблица SimpleSmallObject создана в разделе PRIMARY
Таблица MotleyObject создана в разделе PRIMARY
Таблица BigFatObject создана в разделе PRIMARY
----------------------------------------------------------
Inserting big fat objects (5000 objects) of FakeBenchmark
Time: 00:00:00
Inserting big fat objects (5000 objects) of SqlServerBenchmark
Time: 00:00:18.1424149
Inserting big fat objects (5000 objects) of MongoBenchmark
Time: 00:00:00.7240409
----------------------------------------------------------
Таблица BigFatObject удалена
Таблица MotleyObject удалена
Таблица SimpleSmallObject удалена
Таблица SimpleSmallObject создана в разделе PRIMARY
Таблица MotleyObject создана в разделе PRIMARY
Таблица BigFatObject создана в разделе PRIMARY
----------------------------------------------------------
Inserting big fat objects (10000 objects) of FakeBenchmark
Time: 00:00:00
Inserting big fat objects (10000 objects) of SqlServerBenchmark
Time: 00:00:37.5463217
Inserting big fat objects (10000 objects) of MongoBenchmark
Time: 00:00:01.4380471
----------------------------------------------------------
Таблица BigFatObject удалена
Таблица MotleyObject удалена
Таблица SimpleSmallObject удалена
Таблица SimpleSmallObject создана в разделе PRIMARY
Таблица MotleyObject создана в разделе PRIMARY
Таблица BigFatObject создана в разделе PRIMARY
----------------------------------------------------------
Inserting big fat objects (75000 objects) of FakeBenchmark
Time: 00:00:00
Inserting big fat objects (75000 objects) of SqlServerBenchmark
Time: 00:04:52.2527984
Inserting big fat objects (75000 objects) of MongoBenchmark
Time: 00:00:54.1092347
----------------------------------------------------------
Таблица BigFatObject удалена
Таблица MotleyObject удалена
Таблица SimpleSmallObject удалена
Таблица SimpleSmallObject создана в разделе PRIMARY
Таблица MotleyObject создана в разделе PRIMARY
Таблица BigFatObject создана в разделе PRIMARY
----------------------------------------------------------
Inserting big fat objects (100000 objects) of FakeBenchmark
Time: 00:00:00.0080004
Inserting big fat objects (100000 objects) of SqlServerBenchmark
Time: 00:06:50.2480900
Inserting big fat objects (100000 objects) of MongoBenchmark
Time: 00:00:52.3421973
----------------------------------------------------------
----------------------------------------------------------
Inserting big fat objects (1000000 objects) of FakeBenchmark
Time: 00:00:00.0850049
Inserting big fat objects (1000000 objects) of MongoBenchmark
Time: 00:12:22.2788211
Не вписывающиеся в общую картину выпады вниз на втором графике со стороны Mongo объясняются малым количеством установленной памяти (а Бил когда то про 640КБ втирал...).
Т.е. эксперименты запускались по порядку и скул не успел еще отпустить занятые им 1.5ГБ, но думаю общую картину это не исказило.
Так же нехваткой памяти объясняется и резкий скачок вверх на вставке миллиона записей.
На мой взгляд, эксперимент получился достаточно интересным.
Таким образом, любые объекты и в любом количестве Mongo добавляет значительно быстрее сиквела, и чем больше база дынных, тем значительнее преимущество Mongo.
Так что подтвердился вывод по возможным областям применения этой СУБД из предыдущего поста.
Разумеется, это не последний эксперимент по сравнению этих двух замечательных СУБД, в следующий раз наверно сравню производительность обновления данных
1 комментарий:
Срочно добавить поддержку Oracle!
Для своей работы Mongo требует объемы RAM, пропорциональные объемам данных.
Когда уже в кластере будешь тестить? :)
Отправить комментарий