Frage

Diese Frage wird zu einem anderen Zusammenhang:
Will mit mehreren Dateigruppen helfen, meine Datenbank zu beschleunigen?

Die Software wir entwickeln ist ein analytisches Werkzeug, das MS SQL Server 2005 verwendet relationale Daten zu speichern. Ein erste Analyse kann langsam sein (da wir Millionen oder Milliarden von Datenzeilen sind die Verarbeitung), aber es gibt Leistungsanforderungen an unter Hinweis auf frühere Analysen schnell, so dass wir „Speicher“ Ergebnisse jeder Analyse.

Unser aktueller Ansatz ist die Analyseergebnisse in einer Reihe von „run-spezifischen“ Tabellen zu speichern, und die Analyse ist komplex genug, dass wir mit so viele als 100 Tabellen pro Analyse könnten am Ende. Normalerweise werden diese Tabellen aufbrauchen ein paar hundert MB pro Analyse (die klein ist im Vergleich zu unseren Hunderte von GB, oder manchmal mehrere TB, der Quelldaten). Aber alles in allem, Speicherplatz ist kein Problem für uns. Jeder Satz von Tabellen ist spezifisch für eine Analyse, und in vielen Fällen ist dies bietet uns enorme Leistungsverbesserungen gegenüber Rückbezug auf die Quelldaten.

Der Ansatz zu brechen beginnt nach unten, sobald wir genug gespeicherten Analyseergebnisse akkumulieren - bevor wir robustere Archiv / Bereinigung Fähigkeit hinzugefügt, stieg unsere Testdatenbank auf mehr Millionen Tabellen. Aber es ist keine Strecke für uns mehr als 100.000 Tabellen zu haben, auch in der Produktion. Microsoft stellt eine ziemlich enorme theoretische Grenze für die Größe von sysobjects (~ 2 Mrd.), aber sobald unsere Datenbank über 100.000 wächst oder so, einfache Abfragen wie CREATE TABLE und dramatisch verlangsamen fallen kann.

Wir haben einige Zimmer unser Ansatz zur Debatte, aber ich denke, dass hart sein könnte, ohne mehr Kontext zu tun, also stattdessen möchte ich ganz allgemein die Frage stellen: Wenn wir so viele Tabellen erstellen gezwungen sind, was ist der beste Ansatz für sie verwalten? Mehrere Dateigruppen? Mehrere Schemata / Besitzer? Mehrere Datenbanken?

Noch ein Hinweis: Ich bin nicht begeistert von der Idee der „einfach Hardware auf das Problem werfen“ (das heißt das Hinzufügen RAM, CPU-Leistung, Plattengeschwindigkeit). Aber wir werden es auch nicht auszuschließen, vor allem, wenn (zum Beispiel) jemand uns definitiv sagen kann, welche Auswirkungen das Hinzufügen RAM oder mehrere Dateigruppen mit auf die Verwaltung eines großen Systemkatalog haben.

War es hilfreich?

Lösung 4

Wir sind am Ende unserer Datenbank in mehrere Datenbanken aufzuteilen. So ist die Hauptdatenbank enthält eine „Datenbanken“ Tabelle, die auf eine oder mehrere „run“ Datenbanken bezieht, von denen jede unterschiedliche Sätze von Analyseergebnisse enthält. Dann wird der Haupt „run“ Tabelle enthält eine Datenbank-ID und den Code, der eine gespeicherte Ergebnis abruft enthält die entsprechende Datenbank-Präfix auf alle Anfragen.

Dieser Ansatz ermöglicht es der Systemkatalog jeder Datenbank sinnvoller zu sein, ist es eine bessere Trennung zwischen der Kern / permanenten Tabellen und den dynamischen / run Tabellen bietet, und es macht auch Backups und Archivierung mehr überschaubar. Es erlaubt uns auch, unsere Daten über mehrere physische Datenträger aufzuteilen, obwohl mehrere Dateigruppen verwenden würde das auch getan haben. Insgesamt funktioniert es gut für uns jetzt unsere aktuellen Anforderungen gegeben, und auf Basis der erwarteten Wachstum halten wir es für uns gut skalieren wird.

Wir haben auch bemerkt, dass SQL 2008 neigt große Systemkataloge zu behandeln besser als SQL 2000 und SQL 2005 tat. (Wir hatten nicht bis 2008 aufgerüstet, wenn ich diese Frage gestellt.)

Andere Tipps

Ohne zunächst das gesamte System zu sehen, meine erste Empfehlung wäre es, die historischen Läufe in kombinierten Tabellen als Teil des Schlüssels mit einem RunID speichern - ein dreidimensionales Modell auch hier relevant sein kann. Diese Tabelle kann für eine Verbesserung partitioniert werden, die auch Sie erlaubt, den Tisch in andere Dateigruppen zu verbreiten.

Ein andere Möglichkeit es jeden Lauf in seiner eigenen Datenbank zu setzen und sie dann lösen, befestigen sie nur bei Bedarf (und im schreibgeschützten Form)

CREATE TABLE und DROP TABLE wahrscheinlich schlechte Leistung, weil die Master oder Modelldatenbanken sind für diese Art von Verhalten nicht optimiert.

Ich empfehle auch zu Microsoft über Ihre Wahl von Datenbank-Design zu sprechen.

Sind die Tabellen alle unterschiedlichen Strukturen? Wenn sie die gleiche Struktur haben Sie vielleicht mit einem einzigen partitionierten Tabelle wegzukommen.

Wenn sie unterschiedliche Strukturen sind, sondern nur Teilmengen von dem gleichen Satz von Dimensionsspalten, könnten Sie noch speichern sie in Partitionen in derselben Tabelle mit NULL-Werten in den nicht-anwendbar Spalten.

Wenn dies analytisch (derivative Preisberechnungen vielleicht?), Um die Ergebnisse einer Berechnung läuft auf flache Dateien Dump könnte und Ihre Berechnungen wiederverwenden, indem von den flachen Dateien geladen werden.

Dies scheint ein sehr interessantes Problem / Anwendung, die Sie arbeiten. Ich würde gerne auf so etwas zu arbeiten. :)

Sie haben eine sehr große Problem Oberfläche, und das macht es schwer, zu helfen zu beginnen. Es gibt mehrere Lösungsparameter, die nicht offensichtlich in Ihrem Beitrag sind. Zum Beispiel, wie lange planen Sie die Laufanalysetabellen zu halten? Es gibt eine Menge anderer Fragen, die gestellt werden müssen.

Sie werden eine Kombination von schweren Data Warehousing und Daten / Tabellenpartitionierung müssen. Je nachdem, wie viele Daten Sie behalten möchten, und archivieren Sie müssen de-Normalisierung und Abflachen der Tabellen kann beginnen.

Das wäre ziemlich gut Fall, in dem Sie sich an Microsoft direkt für beide Seiten von Vorteil sein kann. Microsoft bekommt einen guten Fall, dass andere Kunden zu zeigen, und Sie Hilfe bekommen direkt vom Anbieter.

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