База данных вставляет производительность

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

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

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 Server:

Общее тестовое время: 18 секунд. 5 349 цен в секунду.

Сервер MongoDB:

Общее тестовое время: 3 секунды. 25 555 цен в секунду.

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

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

У кого-либо есть какие-либо предложения для других баз данных, которые могли соответствовать? Я буду пробовать HDF5 и MonetDB позже сегодня вечером также. Его необходимое, чтобы иметь много клиентский доступ.

Спасибо за любые предложения!

ОБНОВЛЕННЫЙ:

Извините, но я сделал основное редактирование своего вопроса перед установкой, и кажется, что я не учел серверные версии и некоторые детали аппаратных средств. Все тесты были на 8 базовых серверах с RAM на 12 ГБ, запускающей Windows 2008 x64.

Предприятие Microsoft SQL Server 2008 года x64. MySQL 5.1.44, работающий как таблица InnoDB. MongoDB 1.2.4 x64

Текущий тест является простым циклом строки, вставляет в DBS с реальными историческими данными NASDAQ, скомпилированной в файле CSV, уже импортированном в память. Код был в C# NET4 x64.

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

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

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

ОБНОВЛЕНИЕ 3:

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

Microsoft SQL Server (объем):

Общее тестовое время: 2 секунды. 39 401 цена в секунду.

12
задан Erik 7 March 2010 в 00:30
поделиться

7 ответов

Я могу комментировать только sql-server, но есть кое-что, что стоит попробовать:

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

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

5
ответ дан 2 December 2019 в 22:05
поделиться

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

2
ответ дан 2 December 2019 в 22:05
поделиться

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

0
ответ дан 2 December 2019 в 22:05
поделиться

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

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

1
ответ дан 2 December 2019 в 22:05
поделиться

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

0
ответ дан 2 December 2019 в 22:05
поделиться

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

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

Но в любом случае, если вам нужна хорошо масштабируемая БД, оптимизированная для записи, посмотрите Cassandra из Apache Incubation. Мельница слухов говорит, что Твиттер скоро его примет .

3
ответ дан 2 December 2019 в 22:05
поделиться

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

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

PS: Простите, если я констатирую очевидное.

0
ответ дан 2 December 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: