Ich erstelle eine Datenbank mit etwa 30 Tabellen, wobei jede Tabelle zig Millionen Zeilen und jede Tabelle eine einzelne wichtige Spalte und eine Primär- / Fremdschlüsselspalte enthält, um die Abfrageeffizienz angesichts hoher Anforderungen zu maximieren Aktualisierungen und Einfügungen sowie häufige Verwendung von Clustered-Indizes. Zwei der Tabellen enthalten Textdaten variabler Länge, von denen eine Hunderte Millionen Zeilen enthält, der Rest jedoch nur numerische Daten.
Da ich wirklich den letzten Tropfen der verfügbaren Hardware (etwa 64 GB RAM, eine sehr schnelle SSD und 16 Kerne) ausnutzen möchte, habe ich mir überlegt, jeder Tabelle eine eigene Datei zuzuweisen, egal ob Ich verbinde auf 2, 3, 4, 5 oder mehr Tabellen, jede Tabelle wird immer mit einem separaten Thread gelesen und die Struktur jeder Datei wird eng mit dem Tabelleninhalt abgestimmt, was hoffentlich die Fragmentierung minimieren und schneller machen würde für SQL Server zum Inhalt einer beliebigen Tabelle hinzufügen.
Eine Einschränkung, ich bin auf SQL Server 2008 R2 Web Edition stecken . Das heißt, ich kann die automatische horizontale Partitionierung nicht verwenden, was eine Leistungssteigerung ausschließt.
Maximiert die Verwendung einer Datei pro Tabelle tatsächlich die Leistung, oder übersehen ich die Eigenschaften des integrierten SQL Server-Moduls, die dies überflüssig machen würden?
Zweitens, wenn die Verwendung einer Datei pro Tabelle von Vorteil ist, warum kann create table
ich die Tabelle dann nur einer Dateigruppe und nicht einer bestimmten logischen Datei zuordnen? In diesem Fall müsste ich für jede Datei in meinem Szenario eine eigene Dateigruppe erstellen, was darauf hindeutet, dass SQL Server möglicherweise nicht die Vorteile sieht, von denen ich annehme, dass sie sich aus dem ergeben, was ich vorschlage.
quelle
Mein erster Vorschlag wäre, keine Annahmen über die Leistung zu treffen, ohne Lasttests für beide Konfigurationen durchzuführen.
Wenn ich in der Vergangenheit solche Konfigurationen gesehen hätte (die auf dem Papier sinnvoll sind), hätte das vermutlich keine messbaren positiven Auswirkungen auf die Leistung, wenn jede Tabelle in einer separaten Datei enthalten wäre. Die zusätzliche Komplexität würde alle Leistungssteigerungen ausgleichen auch wenn sie messbar wären.
Zum Schluss verweise ich Sie auf die folgende Tabelle, wenn es darum geht, jeden Leistungsabfall aus einem SQL Server herauszuholen:
Potenzielle Optimierungen, die aus Sicht der Anwendung vorgenommen werden könnten, stellen mögliche Optimierungen auf Hardware- / Datenbankkonfigurationsebene in den Schatten.
quelle
Wie andere angemerkt haben, gibt es keinen direkten Nutzen aus einer Datei pro Tabelle. Hier ist eine großartige Zusammenfassung von Steve Jones, wie dieser Mythos entstand: http://www.sqlservercentral.com/blogs/steve_jones/2009/10/13/sql-server-legend-data-files-and-threads/
Möglicherweise möchten Sie auch eine partitionierte Ansicht untersuchen, die meines Erachtens von der 2008 Web Edition unterstützt wird. Es gibt einige Tricks beim Codieren mit einer partitionierten Ansicht, aber Sie können einen Großteil der Funktionalität partitionierter Tabellen relativ einfach nachahmen.
quelle
Ich denke, dass separate Dateien für jede Tabelle keinen Leistungsvorteil bringen würden. Die richtigen Indizes können eine potenzielle Leistungssteigerung (Datenträgerlesung) auf dem Datenbankserver aufweisen.
Unterstützt der SQL Server 2008 R2 die Komprimierung? Wenn ja, schalten Sie das ein.
Korrigiere mich, wenn ich falsch liege.
quelle