2016-05-16 7 views
0

Ich versuche derzeit, eine Lösung zu finden, um Daten, die sich häufig ändern, optimal zu optimieren. Auf dem Server wird IIS/SQL Server ausgeführt, und es handelt sich um eine ASP.NET-Web-API-Anwendung. Meine Tabellenstruktur ist so etwas wie die folgenden:Lösung für den Umgang mit Daten, die sich häufig ändern

Benutzertabelle: UserID PK

Statustabelle: StatusID PK, Titel varchar

Userstatus Tabelle: UserID PK (CLUSTERED), StatusID FK (NON-CLUSTERED), Datum DateTimeOffset (POSSIBLY INDEXED) - Dies würde als Ablaufdatum verwendet werden. Alte Aufzeichnungen werden irrelevant.

Es wird mehr als 5000 Datensätze in der Benutzertabelle geben. Die Statustabelle enthält ungefähr 500 Datensätze. Die UserStatus-Tabelle würde häufige Änderungen (alle 5-30 Sekunden) in die Status-ID und Datumsfelder von 0 bis 1000 Benutzern jederzeit ändern. In dieser UserStatus-Tabelle werden auch häufige SELECT-Abfragen durchgeführt und Datensätze mit alten/irrelevanten Daten ausgefiltert.

  • Ich habe als mit einem Datensatz, der die Userstatus Tabelle bevöl für
    jeder Benutzer nur die Durchführung Updates. Dies würde bedeuten, dass
    immer der erwartete Datensatz vorhanden wäre und es würde die Prüfungen
    für die Existenz begrenzen. Meine Sorge ist Leistung und alle Zersplitterung
    der Indizes. Ich würde dann gegen die Tabelle nach Datensätzen mit Daten fragen, die innerhalb einiger Minuten der aktuellen Zeit fallen.
  • Ich habe nur in Betracht gezogen, relevante Datensätze in die UserStatus-Tabelle einzufügen, zu aktualisieren, wenn sie für einen Benutzer vorhanden sind, und eine Aufgabe auszuführen, die alte/irrelevante Daten ausräumt. Diese Methode würde die Anzahl der Datensätze halten, aber ich würde für die Existenz von Datensätzen vor dem Ausführen einer Aufgabe überprüfen müssen und Indizes können Leistung verhindern.
  • Schließlich habe ich einen MemoryCache oder etwas Ähnliches in Betracht gezogen. I weiß nicht viel über das Zwischenspeichern in einer Web-API, aber von dem, was ich darüber gelesen habe, entschied ich mich schnell gegen dieses wegen der potenziellen Gleichzeitigkeitsprobleme beim Iterieren über den Cache.

Hat jemand eine Empfehlung für ein solches Szenario? Gibt es eine andere Methode, die ich nicht in Betracht ziehe?

Antwort

1

Angesichts der Anzahl der Datensätze, über die Sie sprechen, würde ich die Tsql Merge verwenden, die vorhandene Datensätze aktualisieren und neue mit einer effizienten Anweisung hinzufügen.

Angesichts des Designs, das Sie erwähnten, sollten Sie in der Lage sein, ein periodisches maint-Skript auszuführen, das Fragmentierungsprobleme behebt.

Die Lösung kann skaliert werden. Wenn die Aufzeichnungen den Punkt erreichten, an dem eine Verlangsamung stattfand, würde ich eine SSD in Betracht ziehen, bei der Fragmentierung kein Problem ist.

Wenn die Nachteile von SSD so unerwünscht machen, können Sie in In-Memory-OLTP suchen.

+0

er erwähnt "Alte Aufzeichnungen werden irrelevant."Mit solch einem kleinen Dataset könnte er Tabellenvariablen @some_fancy_table verwenden, solange er die Verbindung beibehält. Weitere Details werden benötigt, denke ich ... –

+0

Danke für die Antworten. Wenn Sie Tabellenvariable verwenden, meinen Sie Bulk-Insert/Updates funktionieren nicht in diesem Szenario.Jeder Benutzer sendet seinen Status unabhängig voneinander möglicherweise alle 5-30 Sekunden an den Server.Nur die kleinere Teilmenge von Benutzern wird ihren Status an den Server übertragen, aber jeder kann den Status abfragen von "aktiven" Benutzern. Hier kommt das Datum/die irrelevanten Datensätze ins Spiel. Nur Benutzer, die innerhalb der letzten 5 Minuten einen Statuswechsel hatten, sollten zum Beispiel in eine select-Anweisung zurückkehren. –

Verwandte Themen