2010-03-06 7 views
12

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

Данные вставляются очень просто, как следует:

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, уже импортированный в память. Код был в C# NET4 x64.

Серверы MS SQL и MySQL были настроены на идеальные настройки, в то время как MongoDB был настроен только по умолчанию. Таблицы SQL настроены без индексов, так как цель БД проста в качестве промежуточной площадки перед тем, как быть перенесена в основную систему анализа.

Многие предлагаемые Массовые вставки, однако это сложный способ сделать это, поскольку у нас есть несколько клиентов, которые толкают отдельные тики в БД независимо от живых потоков. Чтобы разрешить такие методы, нам нужно было бы расширить слой перед БД, помимо того, что у нас есть шанс проверить прямо сейчас. Однако я предполагаю, что что-то нужно будет сделать для окончательной архитектуры, поскольку числа, которые мы получаем от всего, кроме MongoDB, недостаточно для обработки количества необходимых входов.

ОБНОВЛЕНИЕ 2: Диски SSD действительно великолепны именно для этого, и мы используем это сами. Однако конечный продукт будет установлен на несколько различных клиентах, которые все предоставляют свое собственное железо .. и получение серверов из ИТ-отдела с SSD по-прежнему трудно ... :(

UPDATE 3:

Я попытался подход BulkCopy предложил производительность при том же цикле, как и другие, но первый в DataTable, а затем BulkInsert в SQL Server привело к следующему:.

Microsoft SQL Server (наливом):

Общий тест время: 2 секунды. 39401 цен на секунду д.

+1

Вы должны проверить с буферными и навалочных вставками, а также. Также убедитесь, что вы используете те же индексы и ограничения, что и настоящая система, и выполните тест с Db, который достаточно заполнен. –

+1

Помните также, что аппаратные средства здесь очень важны, например, некоторые высокопроизводительные SSD-накопители будут приносить огромную производительность, поэтому посмотрите, где вы тратите свои деньги, чтобы узнать, насколько это важно. –

+0

Вы тестируете их на одной машине? вы используете экспресс-версию sql-сервера? –

ответ

5

Я могу только действительно комментировать SQL-сервер, но есть некоторые вещи, чтобы попробовать:

  • команда дозирования (то есть сделать несколько INSERT в один удар в дб)
  • массовой вставки (через SqlBulkCopy)

либо должны дать значительных улучшений в однорядных вставок (причем последняя самым быстрым)

+4

+1 - Недавно я опубликовал сравнение производительности с использованием SqlBulkCopy и пакетных обновлений с использованием SqlDataAdapter здесь: http://www.adathedev.co.uk/2010/02/sqlbulkcopy-bulk-load-to-sql-server.html Результат 0.8229s для вставки 100 000 записей на моем домашнем ПК. – AdaTheDev

+0

@AdaTheDev - хорошая ссылка, спасибо –

+0

Действительно очень интересно. Но у SqlBulkCopy есть проблема с требованием эксклюзивного доступа к таблице при выполнении вставки, нет? – Erik

0

Существует множество способов оптимизации производительности, и разные базы данных обрабатывают данные также очень разные. SQL Server, например, защищает ваши данные, он должен быть уверен, что данные действительны и на диске, прежде чем он позволит вам знать, что вставка была успешной. MySQL и MongoDB делают это, поэтому они могут быть быстрее. Так что ты ищешь? RDBMS или какое-то хранилище, где вы можете позволить себе потерять некоторые данные?

3

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

Вы могли бы по крайней мере поделиться детали ваших тестов. Опуская такую ​​важную информацию, как , какой MySQL-движок вы попробуете, непростительно. И «сырая производительность» неспаренной вставки в базе данных на основе буфера (например, SQL Server или InnoDB) не имеет смысла, это как измерение «необработанной производительности» Ferrari на первой передаче, а затем публикация того «это только до 50 миль в час».

Но в любом случае, если вы хотите масштабируемую оптимизированную для записи базу данных, посмотрите на Cassandra от Apache Incubation. The rumor mill says Twitter will adopt it soon.

0

BerkeleyDB может стоить того, чтобы ваши данные могли быть представлены как пары ключ/значение (как будто в хеше PERL или подобной структуре данных). Это быстрый, многоплановый и безопасный транзакт, даже если это не последняя вещь wizbang.

1

Если вы хотите работать только с вставкой, вы можете получить больше от mysql, используя Archive engine и INSERT DELAYED.

В противном случае попробуйте любой из двигателей KV местного хранения: BDB, QDBM, Tokyo Cabinet и т. Д.

+0

У Archiva низкая производительность при выборе – user710818

0

Вы проверили несколько экземпляров приложений, связанных с сервером базы данных и вставляя данные одновременно или только в одно приложение?

Я думаю, вы должны тестировать несколько экземпляров, особенно для массовой вставки и посмотреть, какая конфигурация работает для вас. Различные режимы изоляции транзакций могут значительно повлиять на производительность для одновременного доступа (особенно для доступа к записи). SQL Server, например, я обнаружил, что более низкий режим изоляции, чем ReadCommitted, должен использоваться для высококонкурентной среды или вы найдете много случаев таймаута. Разумеется, это следует использовать, когда риск грязного чтения не вызывает беспокойства (который соответствует вашему делу, судя по вашему описанию).

PS: Простите меня, если я заявляю здесь очевидное.

2

Как они сравниваются с простым входом в плоский файл в файловой системе? Если запрос выполняется позже, я не уверен, почему вы передаете данные в реляционную базу данных в это время. Есть ли необходимость в транзакциях или множественном доступе к базе данных вообще на этом этапе записи?

+0

Точно, если запрос выполняется позже, никто не превосходит производительность простого добавления в текстовый файл. – Codism

0

Я бы также рассмотрел вопрос о кандидате на выпуск MySQL 5.5. Ребята из Oracle сделали значительные улучшения в этой версии, особенно для выпуска Windows. До 1 500 процентов прироста производительности для операций чтения/записи и до 500 процентов прироста для Read Only. Вы можете обратиться к этой ссылке для получения дополнительной информации:

http://www.mysql.com/news-and-events/generate-article.php?id=2010_04

Смежные вопросы