Frage

Ich bin der Gestaltung einer Tabelle in der Datenbank, die Einträge aus der Anwendung anmelden speichert. Es gibt ein paar Dinge, die ich mehr als sonst über diesen Entwurf denken machen.

  • Allerdings ist diese Log-Einträge werden vom System zur Laufzeit verwendet werden, Entscheidungen zu treffen, so dass sie relativ schnell Zugriff sein müssen.
  • Sie haben auch das Problem ist, dass es viele von ihnen sein wird (12,5 Mio. hinzugefügt pro Monat ist meine Schätzung).
  • Ich brauche nicht mehr als die letzten 30 bis 45 Tage höchstens für die Entscheidungsverarbeitung.
  • Ich brauche viel länger als 45 Tage für die Unterstützung und rechtlichen Fragen, alle von ihnen zu halten, wahrscheinlich atleast 2 Jahren.
  • Das Tischdesign ist ziemlich einfach, alle einfachen Typen (keine Flecke oder etwas), wo möglich, den Datenbank-Engine in den Standarddaten zu setzen, höchstens einen Fremdschlüssel verwendet wird.
  • Wenn es einen Unterschied macht, wird die Datenbank Microsoft SQL Server 2005 sein.

Was ich dachte, wird sie zu einer Live-Tabelle / Datenbank geschrieben habe und dann eine ETL-Lösung move „alte“ Einträge in eine Archivtabelle / Datenbank -., Die groß ist und auf langsame Hardware

Meine Frage ist, kennen Sie irgendwelche Tipps, Tricks und Anregungen für die Datenbank / Tabellen-Design, um sicherzustellen, das so gut wie möglich funktioniert? Auch wenn Sie denken, es ist eine schlechte Idee, lass es mich wissen, und dem, was Sie denken, eine bessere Idee wäre.

War es hilfreich?

Lösung

Einige Datenbanken bieten "Partitionen" (Oracle, zum Beispiel). Eine Partition ist wie eine Ansicht, die in einem mehr Tabellen mit einer identischen Definition sammelt. Sie können Kriterien festlegen, welche Art neue Daten in die verschiedenen Tabellen (zB Monat oder Woche-of-Jahres-% 6).

Aus Sicht des Benutzers, das ist nur eine Tabelle. Aus der Datenbank PoV, dann ist es mehrere unabhängige Tabellen, so dass Sie voll Tabellenbefehle ausführen können (wie truncate, Tropfen, löschen aus der Tabelle (ohne Bedingung), Lade- / dump, etc.) gegen sie auf effiziente Weise.

Wenn Sie eine Partition nicht haben können, erhalten Sie einen ähnlichen Effekt mit Aussicht. In diesem Fall können Sie mehrere Tabellen in einer einzigen Ansicht sammeln und diese Ansicht neu definieren, sagt sie, einmal im Monat auf „frei“ einen Tisch mit alten Daten aus der Ruhe. Jetzt können Sie effizient diese Tabelle archivieren, deaktivieren Sie es und fügen Sie es wieder auf die Ansicht, wenn die große Arbeit geleistet worden. Dies sollte erheblich dazu beitragen, die Leistung zu verbessern.

[EDIT] SQL Server 2005 an (Enterprise Edition) unterstützt Partitionen. Dank Mitch Wheat

Andere Tipps

Große Tabellen verlangsamen schnell nach unten, und es ist ein großer Performance-Overhead ETL zu verwenden, um Daten zu Datum basieren zu ziehen, aus einem großen Tisch und dann die alten Zeilen zu löschen. Die Antwort darauf ist, mehrere Tabellen verwenden - wahrscheinlich 1 Tisch / Monat auf der Grundlage Ihrer Figuren. Natürlich müssen Sie einige Logik müssen die Tabellennamen innerhalb Ihrer Anfragen zu generieren.

Ich bin damit einverstanden Trigger mit der Verwendung der ‚CurrentMonthAudit‘ Tabelle zu füllen, am Ende des Monats, können Sie dann die Tabelle zu MonthAuditYYYYMM umbenennen. Verschieben alte Tabellen aus Ihrem Hauptserver mit ETL wird dann einfach, und jede Ihrer Tabellen überschaubar. Vertrauen Sie mir das ist viel besser als zu versuchen, eine einzelne Tabelle mit ca. 250M Reihen zu verwalten.

Ihre erste gute Entscheidung ist, alles so einfach wie möglich zu halten.

Ich habe Zuschreibung nur Transaktionsprotokolldatei mit dem Muster einer einfachen Glück gehabt, wo die Aufzeichnungen nur gelegt werden in chronologischer Reihenfolge nach unten. Dann haben Sie mehrere Möglichkeiten für Altdaten Umschalten aus. Auch monatliche disparate Tabellen mit überschaubar abfrage weise, solange Sie Einfachheit im Auge behalten. Wenn Sie jede Art von Replikation in Betrieb haben, können Sie Ihre replizierten Tabellen ausgerollt werden und dienen als Archiv. Dann starten Sie mit einem frischen leeren Tisch am ersten eines jeden Monats.

Normalerweise Schauder ich bei den relationalen Design Folgen von so etwas wie dies zu tun, aber ich habe festgestellt, dass Schreib nur chronologische Logtabellen sind eine Ausnahme von den üblichen Entwurfsmustern, aus den Gründen, die Sie hier tun hat.

Aber bleiben Sie weg von Triggern. So weit wie möglich. Die einfachste Lösung ist eine primäre Tabelle vom Typ Sie sprechen hier mit einem einfachen robusten off-the-shelf zeit bewährten Replikationsmechanismus.

(BTW - Große Tabellen verlangsamen nicht schnell, wenn sie gut ausgebildet sind -. Sie verlangsamen langsam)

Wenn Sie nicht die letzten Protokolldatensätze suchen müssen, gibt es eine weitere Option: Sie überhaupt keine Datenbank verwenden. Stattdessen schreiben in eine Datei die Log-Informationen und drehen Sie die jede Nacht Dateinamen. Wenn eine Datei geschrieben wurde, können Sie einen Hintergrund-Job starten, um die Daten direkt in die Archivdatenbank zu importieren.

Datenbanken sind nicht immer die beste Option, vor allem für die Protokolldateien:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top