Was ist der beste Weg, um eine große Anzahl von Tabellen in MS SQL Server zu verwalten?


4

Diese Frage wird zu einem anderen Zusammenhang:
Will having multiple filegroups help speed up my database?

Die Software wir entwickeln ist ein analytisches Werkzeug, das MS SQL Server 2005 verwendet relationale Daten zu speichern. Die anfängliche Analyse kann langsam sein (da wir Millionen oder Milliarden von Datenzeilen verarbeiten), aber es gibt Leistungsanforderungen für den schnellen Abruf früherer Analysen, sodass wir die Ergebnisse jeder Analyse "speichern".

Unser aktueller Ansatz besteht darin, Analyseergebnisse in einer Reihe von "laufspezifischen" Tabellen zu speichern, und die Analyse ist so komplex, dass wir pro Analyse möglicherweise bis zu 100 Tabellen erhalten. Normalerweise verbrauchen diese Tabellen pro Analyse ein paar hundert MB (was im Vergleich zu unseren Hunderten von GB oder manchmal mehreren TB an Quelldaten gering ist). Aber insgesamt ist Speicherplatz für uns kein Problem. Jeder Satz von Tabellen ist spezifisch für eine Analyse und in vielen Fällen führt dies zu enormen Leistungsverbesserungen gegenüber der Rückverweisung auf die Quelldaten.

Der Ansatz bricht zusammen, sobald wir genügend gespeicherte Analyseergebnisse gesammelt haben - bevor wir eine robustere Archivierungs-/Bereinigungsfunktion hinzufügten, stieg unsere Testdatenbank auf mehrere Millionen Tabellen. Aber es ist nicht schwer für uns, mehr als 100.000 Tische zu haben, sogar in der Produktion. Microsoft legt eine ziemlich große theoretische Grenze für die Größe von Sysobjekten (~ 2 Milliarden) fest, aber sobald unsere Datenbank über 100.000 oder so wächst, können einfache Abfragen wie CREATE TABLE und DROP TABLE drastisch verlangsamen.

Wir haben ein wenig Spielraum, um über unseren Ansatz zu debattieren, aber ich denke, dass es ohne Kontext schwierig werden könnte. Stattdessen möchte ich die Frage allgemeiner stellen: Wenn wir gezwungen sind, so viele Tabellen zu erstellen, was ist das? beste Vorgehensweise, um sie zu verwalten? Mehrere Dateigruppen? Mehrere Schemas/Besitzer? Mehrere Datenbanken?

Ein weiterer Hinweis: Ich bin nicht begeistert von der Idee, "einfach Hardware auf das Problem zu werfen" (d. H. RAM, CPU-Leistung, Festplattengeschwindigkeit hinzufügen). Aber wir werden es auch nicht ausschließen, besonders wenn (zum Beispiel) jemand uns definitiv sagen kann, welche Auswirkung das Hinzufügen von RAM oder die Verwendung mehrerer Dateigruppen auf die Verwaltung eines großen Systemkatalogs haben wird.

  0

WOW. Was macht Management Studio mit den vielen Tabellen beim Laden der Liste? Das muss schmerzhaft sein. 23 sep. 082008-09-23 23:38:19

  0

Wir wagen es nicht, dass Management Studio eine Tabellenliste hochzieht. Jedes Mal, wenn jemand dies versehentlich tut, müssen sie entweder den Prozess beenden oder es stürzt einfach ab. Aber das ist bei weitem nicht unser größtes Problem. 30 dez. 082008-12-30 14:49:17

  0

Ich bin gespannt, wie sich das für Sie entwickelt hat, dies scheint ein Bereich zu sein, in dem fast niemand fundierte Informationen darüber hat, wie es zu machen ist und alles Theorie ist. Daher wären alle Antworten gut zu wissen. 16 aug. 112011-08-16 06:58:58

0

Wir haben unsere Datenbank in mehrere Datenbanken aufgeteilt. Die Hauptdatenbank enthält also eine "Datenbank" -Tabelle, die sich auf eine oder mehrere "Lauf" -Datenbanken bezieht, von denen jede einzelne Sätze von Analyseergebnissen enthält. Dann enthält die Haupttabelle "run" eine Datenbank-ID und der Code, der ein gespeichertes Ergebnis abruft, enthält das relevante Datenbankpräfix für alle Abfragen.

Dieser Ansatz ermöglicht es, den Systemkatalog jeder Datenbank zu verbessern, eine bessere Trennung zwischen den Tabellen core/permanent und dynamic/run zu erreichen und Backups und Archivierung leichter zu verwalten. Es ermöglicht uns auch, unsere Daten auf mehrere physische Festplatten zu verteilen, obwohl dies auch mit mehreren Dateigruppen möglich gewesen wäre. Alles in allem funktioniert es jetzt gut für uns, angesichts unserer aktuellen Anforderungen, und basierend auf dem erwarteten Wachstum glauben wir, dass es auch für uns gut skalieren wird.

Wir haben auch festgestellt, dass SQL 2008 eher große Systemkataloge behandelt als SQL 2000 und SQL 2005. (Wir hatten kein Upgrade auf 2008 durchgeführt, als ich diese Frage gestellt habe.)


0

Dies scheint ein sehr interessantes Problem/Anwendung zu sein, mit der Sie arbeiten. Ich würde gerne an so etwas arbeiten. :)

Sie haben ein sehr großes Problem Oberfläche, und das macht es schwer zu helfen. Es gibt mehrere Lösungsparameter, die in Ihrem Beitrag nicht ersichtlich sind. Wie lange planen Sie beispielsweise, die Analysetabellen zu führen? Es gibt eine Menge andere Fragen, die gestellt werden müssen.

Sie werden eine Kombination aus seriösem Data Warehousing und Daten-/Tabellenpartitionierung benötigen. Je nachdem, wie viele Daten Sie behalten und archivieren möchten, müssen Sie möglicherweise mit dem Entnormalisieren und Reduzieren der Tabellen beginnen.

Dies wäre ein ziemlich guter Fall, in dem die direkte Kontaktaufnahme mit Microsoft von gegenseitigem Nutzen sein kann. Microsoft bekommt einen guten Fall, um anderen Kunden zu zeigen, und Sie erhalten Hilfe direkt vom Verkäufer.


1

Sind die Tabellen alle unterschiedliche Strukturen? Wenn sie dieselbe Struktur haben, könnten Sie mit einer einzelnen partitionierten Tabelle davonkommen.

Wenn es sich um unterschiedliche Strukturen handelt, aber nur um Teilmengen derselben Dimensionsspalten, könnten Sie sie immer noch in Partitionen in derselben Tabelle mit Nullen in den nicht zutreffenden Spalten speichern.

Wenn dies analytisch ist (Derivatpreisberechnungen vielleicht?) Sie könnten die Ergebnisse eines Berechnungslaufs an flache Dateien ausgeben und Ihre Berechnungen wiederverwenden, indem Sie aus den flachen Dateien laden.


2

Ohne zuerst das gesamte System zu sehen, wäre meine erste Empfehlung, die historischen Läufe in kombinierten Tabellen mit einer RunID als Teil des Schlüssels zu speichern - ein Dimensionsmodell könnte hier ebenfalls relevant sein. Diese Tabelle kann zur Verbesserung partitioniert werden, wodurch Sie die Tabelle auch in andere Dateigruppen aufteilen können.

Ein andere Möglichkeit es jeden Lauf in seiner eigenen Datenbank zu setzen und sie dann lösen, befestigen sie nur bei Bedarf (und in Nur-Lese-Form)

CREATE TABLE und DROP TABLE wahrscheinlich schlechte Leistung, weil der Kapitän oder Modelldatenbanken sind für diese Art von Verhalten nicht optimiert.

Ich empfehle auch, mit Microsoft über Ihre Wahl des Datenbankentwurfs zu sprechen.