Ich entwickle Software, die viele Daten in einer ihrer Datenbanktabellen speichert (SQL Server Version 8, 9 oder 10). Angenommen, pro Tag werden ungefähr 100.000 Datensätze in diese Tabelle eingefügt. Dies sind ungefähr 36 Millionen Datensätze pro Jahr. Aus Angst, dass ich an Leistung verlieren würde, habe ich beschlossen, jeden Tag eine neue Tabelle zu erstellen (eine Tabelle mit dem aktuellen Datum im Namen), um die Anzahl der Datensätze pro Tabelle zu verringern.
Könnten Sie mir bitte sagen, ob es eine gute Idee war? Gibt es ein Datensatzlimit für SQL Server-Tabellen? Oder wissen Sie, wie viele Datensätze (mehr oder weniger) in einer Tabelle gespeichert werden können, bevor die Leistung erheblich beeinträchtigt wird?
sql-server
database-design
Mariusz Schimke
quelle
quelle
Antworten:
Es ist schwer, eine generische Antwort darauf zu geben. Es hängt wirklich von der Anzahl der Faktoren ab:
etc.
Wie an anderer Stelle hier beantwortet, sind 100.000 pro Tag und damit pro Tisch übertrieben - ich würde monatlich oder wöchentlich vorschlagen, vielleicht sogar vierteljährlich. Je mehr Tabellen Sie haben, desto größer wird der Albtraum der Wartung / Abfrage.
quelle
Dies sind einige der Spezifikationen für die maximale Kapazität für SQL Server 2008 R2
quelle
bigint
)Ich habe eine dreispaltige Tabelle mit etwas mehr als 6 Milliarden Zeilen in SQL Server 2008 R2.
Wir fragen es jeden Tag ab, um minutenweise Systemanalysediagramme für unsere Kunden zu erstellen. Ich habe keine Beeinträchtigungen der Datenbankleistung bemerkt (obwohl die Tatsache, dass sie jeden Tag um ~ 1 GB zunimmt, die Verwaltung von Backups etwas komplizierter macht, als ich es gerne hätte).
Update Juli 2016
Wir haben es auf ~ 24,5 Milliarden Zeilen geschafft, bevor die Backups groß genug wurden, um Datensätze zu kürzen, die älter als zwei Jahre sind (~ 700 GB, die in mehreren Backups gespeichert sind, auch auf teuren Bändern). Es ist erwähnenswert, dass die Leistung bei dieser Entscheidung kein wesentlicher Motivator war (dh sie funktionierte immer noch hervorragend).
Für alle, die versuchen, 20 Milliarden Zeilen von SQL Server zu löschen, empfehle ich diesen Artikel . Relevanter Code für den Fall, dass der Link stirbt (eine vollständige Erklärung finden Sie im Artikel):
ALTER DATABASE DeleteRecord SET RECOVERY SIMPLE; GO BEGIN TRY BEGIN TRANSACTION -- Bulk logged SELECT * INTO dbo.bigtable_intermediate FROM dbo.bigtable WHERE Id % 2 = 0; -- minimal logged because DDL-Operation TRUNCATE TABLE dbo.bigtable; -- Bulk logged because target table is exclusivly locked! SET IDENTITY_INSERT dbo.bigTable ON; INSERT INTO dbo.bigtable WITH (TABLOCK) (Id, c1, c2, c3) SELECT Id, c1, c2, c3 FROM dbo.bigtable_intermediate ORDER BY Id; SET IDENTITY_INSERT dbo.bigtable OFF; COMMIT END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK END CATCH ALTER DATABASE DeleteRecord SET RECOVERY FULL; GO
Update November 2016
Wenn Sie so viele Daten in einer einzigen Tabelle speichern möchten, tun Sie dies nicht. Ich empfehle dringend, die Tabellenpartitionierung in Betracht zu ziehen (entweder manuell oder mit den integrierten Funktionen, wenn Sie Enterprise Edition ausführen). Dies macht das Löschen alter Daten so einfach wie das einmalige Abschneiden einer Tabelle (Woche / Monat / etc.). Wenn Sie nicht über Enterprise verfügen (was wir nicht haben), können Sie einfach ein Skript schreiben, das einmal im Monat ausgeführt wird, Tabellen löscht, die älter als 2 Jahre sind, die Tabelle des nächsten Monats erstellt und eine dynamische Ansicht neu generiert, die die gesamte Partition verbindet Tabellen zusammen für einfache Abfrage. Offensichtlich sollten "einmal im Monat" und "älter als 2 Jahre" von Ihnen basierend darauf definiert werden, was für Ihren Anwendungsfall sinnvoll ist.
quelle
Ich kenne kein Zeilenlimit, aber ich kenne Tabellen mit mehr als 170 Millionen Zeilen. Sie können dies mithilfe partitionierter Tabellen (2005+) oder Ansichten, die mehrere Tabellen verbinden, beschleunigen.
quelle
Ich kenne MSSQL nicht speziell, aber 36 Millionen Zeilen sind für eine Unternehmensdatenbank nicht groß. Wenn ich mit Mainframe-Datenbanken arbeite, klingen 100.000 Zeilen für mich wie eine Konfigurationstabelle :-).
Während ich kein großer Fan von bin einige von Microsofts Software, ist dies nicht greifen wir hier reden: Ich gehe davon aus können sie ziemlich erhebliche Datenbankgrößen mit ihrem Unternehmen DBMS behandeln.
Ich vermute, dass Tage eine zu feine Lösung gewesen sein könnten, um sie aufzuteilen, wenn sie überhaupt geteilt werden muss.
quelle
Wir haben Tabellen in SQL Server 2005 und 2008 mit über 1 Milliarde Zeilen (30 Millionen täglich hinzugefügt). Ich kann mir nicht vorstellen, das Rattennest hinunterzugehen und das jeden Tag in einen neuen Tisch aufzuteilen.
Es ist viel billiger, den entsprechenden Speicherplatz (den Sie sowieso benötigen) und RAM hinzuzufügen.
quelle
Es kommt darauf an, aber ich würde sagen, es ist der Einfachheit halber besser, alles in einem Tisch zu halten.
100.000 Zeilen pro Tag sind nicht wirklich eine enorme Menge. (Abhängig von Ihrer Serverhardware). Ich habe persönlich gesehen, dass MSSQL problemlos bis zu 100 Millionen Zeilen in einer einzigen Tabelle verarbeitet. Solange Sie Ihre Indizes in Ordnung halten, sollte alles gut sein. Der Schlüssel besteht darin, über jede Menge Speicher zu verfügen, damit die Indizes nicht auf die Festplatte ausgelagert werden müssen.
Auf der anderen Seite hängt es davon ab, wie Sie die Daten verwenden, ob Sie viele Abfragen durchführen müssen, und es werden unwahrscheinliche Daten benötigt, die sich über mehrere Tage erstrecken (sodass Sie nicht an den Tabellen teilnehmen müssen) schneller, um es in mehrere Tabellen aufzuteilen. Dies wird häufig in Anwendungen wie der industriellen Prozesssteuerung verwendet, bei denen Sie möglicherweise alle 10 Sekunden den Wert von beispielsweise 50.000 Instrumenten ablesen. In diesem Fall ist die Geschwindigkeit extrem wichtig, die Einfachheit jedoch nicht.
quelle
Wir haben einen ganzzahligen Primärschlüssel einmal (das sind ~ 2,4 Milliarden Zeilen) in einer Tabelle übergelaufen. Wenn es ein Zeilenlimit gibt, werden Sie es wahrscheinlich nie mit nur 36 Millionen Zeilen pro Jahr erreichen.
quelle
Sie können die Tabelle füllen, bis Sie über genügend Speicherplatz verfügen. Für eine bessere Leistung können Sie versuchen, auf SQL Server 2005 zu migrieren und dann die Tabelle zu partitionieren und Teile auf verschiedene Festplatten zu legen (wenn Sie über eine RAID-Konfiguration verfügen, die Ihnen wirklich helfen könnte). Die Partitionierung ist nur in der Unternehmensversion von SQL Server 2005 möglich. Ein Beispiel für die Partitionierung finden Sie unter folgendem Link: http://technet.microsoft.com/en-us/magazine/cc162478.aspx
Sie können auch versuchen, Ansichten für den am häufigsten verwendeten Datenteil zu erstellen. Dies ist auch eine der Lösungen.
Hoffe das hat geholfen ...
quelle
Die größte Tabelle, auf die ich unter SQL Server 8 unter Windows 2003 gestoßen bin, war 799 Millionen mit 5 Spalten. Aber ob es ein guter Wille ist oder nicht, muss an der SLA und dem Anwendungsfall gemessen werden - z. B. 50-100.000.000 Datensätze laden und prüfen, ob es noch funktioniert.
quelle
SELECT Top 1 sysobjects.[name], max(sysindexes.[rows]) AS TableRows, CAST( CASE max(sysindexes.[rows]) WHEN 0 THEN -0 ELSE LOG10(max(sysindexes.[rows])) END AS NUMERIC(5,2)) AS L10_TableRows FROM sysindexes INNER JOIN sysobjects ON sysindexes.[id] = sysobjects.[id] WHERE sysobjects.xtype = 'U' GROUP BY sysobjects.[name] ORDER BY max(rows) DESC
quelle
Partitionieren Sie die Tabelle monatlich. Dies ist der beste Weg, um Tabellen mit großem täglichen Zufluss zu verarbeiten, sei es Oracle oder MSSQL.
quelle