Wir haben eine SQL-Datenbank, in der Anwendungsnutzungsprotokolle für etwa 3000 PCs gespeichert sind. Diese PCs senden ihre Nutzungsdaten etwa 10 bis 20 Mal pro Tag an den SQL Server. Früher haben wir nur die letzten 60 Tage der Anwendungsnutzung gespeichert, aber der Kunde hat uns gebeten, keine Daten mehr zu löschen. Jetzt, da wir Daten im Wert von ungefähr einem Jahr (ungefähr 6.000.000 Zeilen) haben, leidet die SQL-Datenbank unter einigen Leistungsproblemen. Wohlgemerkt nicht signifikant, aber weitaus mehr als jede andere Datenbank, die wir haben. Pro Stunde wird eine erhebliche Anzahl von Datensätzen hinzugefügt ( offene Datensätze für Anwendungen ). Innerhalb weniger Stunden wird dieser Datensatz nur einmal aktualisiert, wenn die zugehörige Anwendung geschlossen wird . Es sind diese Updates, die Sie über SQL Activity Monitor sehen können, deren Fertigstellung viel Zeit in Anspruch nimmt.
Diese UPDATE-Abfrage ist einfach:
SELECT TOP 1 f_ID
from tb_applicationusage
WHERE f_application = 'xxxxxxx' AND
f_computername = 'xxxxxxxxx' AND
f_endtime IS NULL
ORDER BY f_starttime DESC
Tatsächlich wird der letzte übereinstimmende Anwendungsstart für einen bestimmten Computer gefunden, dem noch keine zugeordnete Anwendung geschlossen ist. Ich kann mir keine effizientere Methode zum Ausführen der Abfrage vorstellen. Daher erwäge ich die folgende Alternative:
Wechseln Sie zu zwei Datenbanken:
- Arbeitsdatenbank mit nur den neuesten 24-Stunden-Datensätzen
- Endgültige Datenbank mit allen anderen Datensätzen
Ich bin kein SQL-Guru, daher fehlen mir wahrscheinlich einige Nachteile dieser Methode. Das Ziel wäre, dass ein SQL Agent-Job die abgeschlossenen Datensätze jede Nacht in die endgültige Datenbank verschiebt. Wenn der Kunde dann seine monatlichen Berichte ausführen möchte, kann dieser Bericht nur die endgültige Datenbank und nicht die Arbeitsdatenbank abfragen. Mit nur vielleicht 10.000 Datensätzen, die in der Arbeitsdatenbank abgefragt werden müssen, anstatt 6.000.000, erscheint es logisch, dass es schneller funktionieren würde. Aber auch hier scheint es so einfach zu sein, dass mir wahrscheinlich etwas Offensichtliches fehlt.
Version: Microsoft SQL Server 2008 R2
INDEX
gibt estb_applicationusage
?