Мы получаем данные GPS в режиме реального времени со скоростью около 5000 pr. минута (с 4-х TCP-серверов). Каждый сервер использует одно соединение для вставки данных и буферизует данные между вставками. Приблизительно каждые 15 минут служба извлекает эти данные и обрабатывает их в командировках. После того, как сгенерированы поездки, фактические данные GPS обычно не так важны, только если пользователь хочет видеть маршрут на карте.
Проблема в том, что, похоже, база данных пытается справиться со скоростью вставляемых данных. Иногда, когда нагрузка увеличивается, время вставки внезапно резко увеличивается (> 30 секунд), что, в свою очередь, позволяет буферизовать больше данных, что, в свою очередь, приводит к увеличению числа вставок и увеличению продолжительности вставки.
Я надеюсь получить некоторые комментарии о текущем дизайне, а также некоторые идеи, которые нам нужны для повышения производительности, и ответы на некоторые наши вопросы - и любые другие советы, которые могут быть у людей!
Текущий дизайн
В настоящее время данные разделены на таблицы, представляющие одну неделю, а данные старше года архивируются во вторичную базу данных. Все это объединено в редактируемом виде, который используется как для вставки, так и для чтения.
Дизайн стола
- Идентификатор (ПК, уникальный идентификатор)
- DeviceId (FK, int)
- PersonId (FK, int)
- VehicleId (FK, int)
- TokenId (FK, int)
- UtcTime (PK, datetime2 (3))
- Широта (плавание)
- Долгота (с плавающей точкой)
- Скорость (smallint)
- Заголовок (smallint)
- Сателлиты (tinyint)
- IOData (varbinary (100))
- IgnitionState (tinyint)
- UserInput (tinyint)
- CreateTimeUtc (datetime2 (3))
индексы
- DeviceId_CreateTimeUtc_Desc
- DeviceId_UtcTime_Desc (кластеризованный)
- PersonId_UtcTime_Desc
- TokenId_UtcTime_Desc
- VehicleId_UtcTime_Desc
Каждая неделя в настоящее время занимает около 10 ГБ, включая индексы, и в настоящее время в основной базе данных находится около 300 ГБ данных.
Таблицы данных в основной базе данных имеют свою собственную файловую группу с одним файлом, но она находится на том же диске, что и все другие таблицы в основной базе данных. Вторичная база данных находится на другом диске, но на том же компьютере.
Я думаю, что мы также запускаем работу по перестройке индекса еженедельно, когда используется новый раздел таблицы (неделя). Без сжатия выполняется.
Машина представляет собой 8-ядерный HP с 12 ГБ памяти, а диск с основной базой данных работает под управлением RAID 10.
идеи
- Ограничьте объем данных, хранящихся в первичной базе данных, например, максимум 1 месяц. По крайней мере, это сделает базу данных более управляемой для резервного копирования / восстановления, но можем ли мы ожидать улучшения производительности при этом?
- Создайте 2 файла в файловой группе для текущих данных и распределите их по 2 различным физическим разделам
- Создайте базы данных master-slave, содержащие текущие данные, чтобы операции вставки и чтения выполнялись в разных базах данных
- Поместите файлы с текущими данными на SSD-диски (может ли зеркалирование повлиять на производительность SSD-дисков?)
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Есть ужасно много факторов, влияющих на производительность, и, вероятно, столько же способов ее настройки.