Мы планируем внедрить систему для регистрации высокой частоты рыночных тиков в БД для дальнейшего анализа. Чтобы просто немного узнать, какую производительность хранения мы можем получить на разных решениях БД, я создал небольшое приложение для вставки базовой строки информации о тике. При запуске одного и того же кода на нескольких разных БД мы получили некоторые интересные результаты.
Вставляемые данные очень просты, например:
CREATE TABLE [dbo].[price](
[product_code] [char](15) NULL,
[market_code] [char](10) NULL,
[currency] [nchar](6) NULL,
[timestamp] [datetime] NULL,
[value] [float] NULL,
[price_type] [char](4) NULL
) ON [PRIMARY]
Microsoft SQL Server:
Общее время тестирования: 32 секунды. 3,099 цены в секунду.
Сервер MySQL:
Общее время тестирования: 18 секунд. 5 349 цен в секунду.
Сервер MongoDB:
Общее время тестирования: 3 секунды. 25 555 цен в секунду.
Цель этого тестирования - просто получить небольшое представление о том, какую "сырую производительность" можно ожидать от систем в нижней части. При реализации решения мы, конечно, будем делать буферизацию, объемные вставки и т.д.
Мы только заботимся о скорости вставки, так как запрос выполняется "офлайн" позже.
Есть ли у кого-нибудь предложения для других баз данных, которые могут поместиться? Сегодня вечером я буду использовать HDF5 и MonetDB. Его необходимо иметь доступ нескольких клиентов.
Спасибо за любые предложения!
ОБНОВЛЕНО:
Извините, но я сделал большое изменение моего вопроса перед тем, как поместить его, и, похоже, я оставил версии сервера и некоторые детали оборудования. Все тесты проводились на 8-ядерном сервере с 12 ГБ оперативной памяти с Windows 2008 x64.
Microsoft SQL Server 2008 Enterprise x64. MySQL 5.1.44 работает как таблица InnoDB. MongoDB 1.2.4 x64
Текущий тест представляет собой простой цикл вставки строк в БД с реальными историческими данными из NASDAQ, скомпилированными в CSV файл, уже импортированный в память. Код был в С# NET4 x64.
Серверы MS SQL и MySQL были настроены на идеальные настройки, в то время как MongoDB был настроен только по умолчанию. Таблицы SQL настроены без индексов, поскольку цель БД проста в качестве промежуточной площадки, прежде чем переносится в основную систему анализа.
Многие предлагали Bulk inserts, однако это сложный способ сделать это, поскольку у нас есть несколько клиентов, которые нажимают одиночные тики в DB независимо от живых потоков. Чтобы разрешить такие методы, нам нужно было бы расширить слой перед БД, помимо того, что у нас есть шанс проверить прямо сейчас. Однако я предполагаю, что для окончательной архитектуры нужно будет сделать что-то, поскольку числа, которые мы получаем от всего, кроме MongoDB, недостаточно для обработки количества необходимых входных данных.
ОБНОВЛЕНИЕ 2: SSD-накопители действительно хороши для этого, и мы сами это используем. Однако конечный продукт будет установлен на нескольких разных клиентах, которые все предоставляют свое железо. И получение серверов из ИТ-отдела с помощью SSD все еще сложно...: (
ОБНОВЛЕНИЕ 3:
Я попробовал подход BulkCopy. Производительность для того же цикла, что и другие, но сначала в DataTable, а затем BulkInsert в SQL Server привела к следующему:
Microsoft SQL Server (Bulk):
Общее время тестирования: 2 секунды. 39401 цен в секунду.