Wir erhalten Echtzeit-GPS-Daten mit einer Rate von ca. 5000 PR. Minute (von 4 TCP-Servern). Jeder Server verwendet eine einzelne Verbindung zum Einfügen der Daten und puffert Daten zwischen Einfügungen. Etwa alle 15 Minuten ruft ein Dienst diese Daten ab und verarbeitet sie zu Fahrten. Sobald die Fahrten generiert wurden, sind die tatsächlichen GPS-Daten normalerweise nicht so wichtig, nur wenn der Benutzer die Route auf einer Karte sehen möchte.
Das Problem ist, dass die Datenbank anscheinend Probleme hat, mit der Dateneinfügungsrate Schritt zu halten. Manchmal, wenn die Last zunimmt, steigt die Einfügezeit plötzlich drastisch an (> 30 Sekunden), wodurch wiederum mehr Daten gepuffert werden können, was wiederum zu größeren Einfügungen und einer längeren Einfügedauer führt.
Ich hoffe, einige Kommentare zum aktuellen Design und einige der Ideen zu erhalten, die wir zur Verbesserung der Leistung benötigen, sowie Antworten auf einige unserer Fragen - und alle anderen Tipps, die Menschen möglicherweise haben!
Aktuelles Design
Die Daten sind derzeit in Tabellen unterteilt, die eine Woche darstellen, und Daten, die älter als ein Jahr sind, werden in einer sekundären Datenbank archiviert. Das Ganze wird in einer bearbeitbaren Ansicht zusammengefügt, die sowohl für Einfügungen als auch für Lesevorgänge verwendet wird.
Tischgestaltung
- ID (PK, eindeutige Kennung)
- DeviceId (FK, int)
- PersonId (FK, int)
- VehicleId (FK, int)
- TokenId (FK, int)
- UtcTime (PK, datetime2 (3))
- Breitengrad (float)
- Längengrad (float)
- Geschwindigkeit (smallint)
- Überschrift (smallint)
- Satelliten (tinyint)
- IOData (varbinary (100))
- IgnitionState (tinyint)
- UserInput (tinyint)
- CreateTimeUtc (datetime2 (3))
Indizes
- DeviceId_CreateTimeUtc_Desc
- DeviceId_UtcTime_Desc (Clustered)
- PersonId_UtcTime_Desc
- TokenId_UtcTime_Desc
- VehicleId_UtcTime_Desc
Derzeit nimmt jede Woche etwa 10 GB einschließlich Indizes ein, und derzeit befinden sich etwa 300 GB Daten in der Hauptdatenbank.
Die Datentabellen in der Hauptdatenbank haben eine eigene Dateigruppe mit 1 Datei, befinden sich jedoch auf derselben Festplatte wie alle anderen Tabellen in der Hauptdatenbank. Die sekundäre Datenbank befindet sich auf einer anderen Festplatte, jedoch auf demselben Computer.
Ich denke, wir führen auch wöchentlich einen Indexwiederherstellungsjob aus, wenn eine neue Tabellenpartition (Woche) verwendet wird. Es wird kein Schrumpfen durchgeführt.
Der Computer ist ein 8-Kern-HP mit 12 GB Speicher, und auf der Festplatte mit der Hauptdatenbank wird RAID 10 ausgeführt.
Ideen
- Begrenzen Sie die in der Primärdatenbank gespeicherte Datenmenge auf maximal 1 Monat. Zumindest würde dies die Verwaltung der Datenbank für die Sicherung / Wiederherstellung erleichtern, aber könnten wir damit eine Leistungsverbesserung erwarten?
- Erstellen Sie 2 Dateien in der Dateigruppe für aktuelle Daten und verteilen Sie sie auf 2 verschiedene physische Partitionen
- Erstellen Sie Master-Slave-Datenbanken mit aktuellen Daten, sodass Einfügungen und Lesevorgänge für verschiedene Datenbanken ausgeführt werden
- Legen Sie Dateien für aktuelle Daten auf SSD-Festplatten ab (würde die Spiegelung bei SSD-Festplatten einen Leistungsunterschied bewirken?)
Bitte lassen Sie mich wissen, wenn weitere Informationen benötigt werden. Es gibt schrecklich viele Faktoren, die die Leistung beeinflussen, und wahrscheinlich ebenso viele Möglichkeiten, sie zu optimieren.