Ми отримуємо дані GPS в режимі реального часу зі швидкістю близько 5000 pr. хвилина (з 4 серверів TCP). Кожен сервер використовує єдине з'єднання для вставки даних та буферизує дані між вставками. Кожні 15 хвилин або близько того служба отримує ці дані та обробляє їх у поїздки. Після генерації подорожей фактичні дані GPS, як правило, не такі важливі, лише якщо користувач хоче бачити маршрут на карті.
Проблема полягає в тому, що, здається, база даних намагається не відставати від швидкості вставки даних. Іноді, коли навантаження збільшується, час вставки раптово різко збільшується (> 30 секунд), що, в свою чергу, дозволяє завантажувати більше даних, що, в свою чергу, призводить до більш великих вставок і більшої тривалості вставки.
Я сподіваюся отримати коментарі до поточного дизайну, а також деякі ідеї, які ми маємо для покращення продуктивності, та відповіді на деякі наші запитання - та будь-які інші поради, які можуть бути у людей!
Поточний дизайн
Наразі дані розділені на таблиці, що представляють один тиждень, а дані старші року перебувають в архіві у вторинну базу даних. Вся справа поєднана разом у редакторі, який можна редагувати, який використовується як для вставок, так і для читання.
Дизайн столу
- Id (PK, унікальний ідентифікатор)
- DeviceId (FK, int)
- PersonId (FK, int)
- Ідентифікатор транспортного засобу (FK, int)
- TokenId (FK, int)
- UtcTime (ПК, дата2 (3))
- Широта (плаваючий)
- Довгота (поплавок)
- Швидкість (smallint)
- Заголовок (smallint)
- Супутники (мініатюра)
- IOData (варбінарний (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 ГБ даних.
У таблицях даних в основній базі даних є своя група файлів з 1 файлом, але вона знаходиться на тому ж диску, що і всі інші таблиці основної бази даних. Вторинна база даних знаходиться на іншому диску, але на одній машині.
Я думаю, що ми також проводимо роботу з відновлення індексу, що відбудується щотижня, коли використовується новий розділ таблиці (тиждень). Усадка не виконується.
Машина являє собою 8-ядерний HP з 12 ГБ пам’яті, а диск, на якому розміщена основна база даних, працює на RAID 10.
Ідеї
- Обмежте кількість даних, що зберігаються в основній базі даних, наприклад, максимум 1 місяць. Принаймні, це зробить базу даних більш керованою для резервного копіювання / відновлення, але чи можна очікувати покращення продуктивності, зробивши це?
- Створіть 2 файли у групі файлів для поточних даних та розподіліть їх на 2 різні фізичні розділи
- Створіть базові-ведені бази даних, що містять поточні дані, тому вставки та зчитування виконуються на різних базах даних
- Помістіть файли поточних даних на SSD-диски (чи відображення дзеркальних даних має різницю в продуктивності з SSD-дисками?)
Будь ласка, повідомте мене, якщо вам потрібна додаткова інформація. Існує жахливо багато факторів, що впливають на продуктивність, і, ймовірно, однаково багато способів налаштувати його.