Recebemos dados de GPS em tempo real a uma taxa de cerca de 5000 pr. minuto (de 4 servidores TCP). Cada servidor usa uma conexão única para inserir os dados e armazena em buffer os dados entre as inserções. A cada 15 minutos, aproximadamente, um serviço busca esses dados e os processa em viagens. Depois que as viagens são geradas, os dados reais do GPS geralmente não são tão importantes, apenas se o usuário quiser ver a rota em um mapa.
O problema é que parece que o banco de dados está lutando para acompanhar a taxa de dados inseridos. Às vezes, quando a carga aumenta, o tempo de inserção aumenta repentinamente drasticamente (> 30 segundos), o que, por sua vez, permite que mais dados sejam armazenados em buffer, o que resulta em pastilhas maiores e maior duração da pastilha.
Espero receber alguns comentários sobre o design atual e algumas das idéias que temos para melhorar o desempenho, além de respostas para algumas de nossas perguntas - e outras dicas que as pessoas possam ter!
Design atual
Atualmente, os dados são separados em tabelas que representam uma semana e os dados anteriores a um ano são arquivados em um banco de dados secundário. A coisa toda é unida em uma exibição editável, usada para inserções e leituras.
Design da mesa
- ID (PK, identificador exclusivo)
- DeviceId (FK, int)
- PersonId (FK, int)
- ID do veículo (FK, int)
- TokenId (FK, int)
- UtcTime (PK, datetime2 (3))
- Latitude (flutuante)
- Longitude (flutuante)
- Velocidade (smallint)
- Título (smallint)
- Satélites (tinyint)
- IOData (varbinário (100))
- IgnitionState (tinyint)
- UserInput (tinyint)
- CreateTimeUtc (datetime2 (3))
Índices
- DeviceId_CreateTimeUtc_Desc
- DeviceId_UtcTime_Desc (agrupado)
- PersonId_UtcTime_Desc
- TokenId_UtcTime_Desc
- VehicleId_UtcTime_Desc
Atualmente, toda semana ocupa cerca de 10 GB, incluindo índices, e atualmente existem cerca de 300 GB de dados no banco de dados principal.
As tabelas de dados no banco de dados principal têm seu próprio grupo de arquivos com 1 arquivo, mas estão no mesmo disco que todas as outras tabelas no banco de dados principal. O banco de dados secundário está em um disco diferente, mas na mesma máquina.
Acho que também estamos executando um trabalho de reconstrução do índice semanalmente, quando uma nova partição de tabela (semana) é usada. Nenhum encolhimento é realizado.
A máquina é um HP de 8 núcleos com 12 GB de memória e o disco que contém o banco de dados principal está executando o RAID 10.
Ideias
- Limite a quantidade de dados armazenados no banco de dados primário para, por exemplo, no máximo 1 mês. No mínimo, isso tornaria o banco de dados mais gerenciável para backup / restauração, mas poderíamos esperar uma melhoria no desempenho fazendo isso?
- Crie 2 arquivos no grupo de arquivos para dados atuais e distribua-os em 2 partições físicas diferentes
- Crie bancos de dados mestre-escravo com dados atuais, para que inserções e leituras sejam executadas em diferentes bancos de dados
- Colocar arquivos para dados atuais em discos SSD (o espelhamento faria alguma diferença de desempenho com os discos SSD?)
Entre em contato se precisar de mais informações. Há terrivelmente muitos fatores que influenciam o desempenho e, provavelmente, muitas maneiras de ajustá-lo.