Ein paar Gedanken zum Thema Partitionierung, Performance etc:
Das eine Datenbank mit der Zeit immer größer wird, stellt, sofern der Storage richtig dimensioniert ist, kein Problem dar.
Eine Partitionierung macht meines Erachtens immer nur dann sinn, wenn wir mit Datenbankgrößen von hunderten Gigabytes unterwegs sind.
SQL Server Partitionen sind aus Sage Sicht kein Gamebreaker, machen aber nur sinn, wenn wirklich extrem hohes Belegaufkommen mit sehr vielen Positionen stattfindet. Selbst dann macht eine Partitionierung nur Sinn, wenn Abfragen nur einen bestimmten Datenbereich benötigen (meistens Auswertungen und kostspielige Select Statments).
Für eine erfolgreiche Partitionierung muss zunächst festgestellt werden, welche Tabellen am größten sind und man muss sich Gedanken darüber machen, welchen Datenbereich man auslagern möchte. Der Storage, auf den Partitionen ausgelagert werden sollen muss immer zur Verfügung stehen und Online sein. Das heißt, entweder ein zusätzliches Raid Array (was langsamere Platten haben darf als der Host) oder eine weitere virtuelle Festplatte. Keinesfalls jedoch Netzlaufwerke, NAS-Speicher oder ähnliches, was vom SQL Server getrennt sein könnte.
Eine Partitionierung betrachtet immer nur einen zuvor fest definierten Datenbereich. Bei Jahreswechsel oder auch nach einiger Zeit (je nach Datenwachstum) muss das Partitionsschema von Hand angepasst werden, oder man automatisiert dieses via Script. Stackoverflow bietet hier ein paar gute Referenzimplementierungen.
Bevor ich jedoch anfange zu partitionieren, sollte ich mir meine Datenbank über den Tag einmal betrachten und schauen, was denn da tatsächlich am längsten dauert. Ein kaum bekanntes Feature dazu ist der
Abfragespeicher
Diesen gilt es zunächst für die zu überwachende Datenbank zu aktivieren (rechtsklick auf die DB im SQL Server Management Studio und dann Eigenschaften). Dann den Betriebsmodus auf Lesen/Schreiben stellen und der DB ein paar Tage zeit lassen, Daten zu sammeln.
Danach stehen unter der Datenbank im Bereich Abfragespeicher großartige Standardauswertungen zur Verfügung
Diese liefern tatsächlich auch gleich noch entsprechende Indexoptimierungsratschläge mit
Mehr Indizes bedeuten gleichermaßen ein weiteres Wachstum der reinen Datenbankdateien. Hier muss ich natürlich immer abwägen, jedoch darf über den Daumen gesagt der Indexspeicher ruhig halb so groß sein wir die eigentliche Datenbank. Muss ich natürlich zehntausende Belegpositionen im Batch einfügen und das immer wieder, so sind viele Indizes auf der Belegpositionstabelle eher kontraproduktiv. Man sieht, es ist immer von der jeweiligen Arbeitslast und Anwendung abhängig.
Ein Wort noch zum Thema
Aufteilung von DB, TempDB und log auf
mehrere Datenträger. Hier muss ich meinem Vorredner wiedersprechen. Es ist richtig, dass wir heute meistens alle Daten eh auf virtuellen Festplatten lagern und diese einem globalen Physischen Storage unterliegen. Jedoch hat jeder Datenträger (also auch jede virtuelle HDD) seine eigene Warteschlange, die vom Betriebssystem abgearbeitet wird. Diese Abarbeitungen finden immer seriell statt und daher ist es aus SQL-Performance-Sicht durchaus ein Unterschied, wenn ich Data, Logs und Tempdb auf drei unterschiedlichen Laufwerken liegen habe. Nur so haben ich unterschiedliche Warteschlangen die dann tatsächlich auch parallel abgearbeitet werden können.