SQL Server: Die maximale Anzahl von Zeilen in der Tabelle [geschlossen]

79

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?

Mariusz Schimke
quelle
31
"Programmierer verschwenden enorm viel Zeit damit, über die Geschwindigkeit unkritischer Teile ihrer Programme nachzudenken oder sich darüber Gedanken zu machen, und diese Effizienzversuche wirken sich tatsächlich stark negativ aus, wenn Debugging und Wartung in Betracht gezogen werden. Wir sollten beispielsweise kleine Effizienzvorteile vergessen." 97% der Zeit: Vorzeitige Optimierung ist die Wurzel allen Übels. Dennoch sollten wir unsere Chancen in diesen kritischen 3% nicht verpassen. " Knuth 1974
Matthew Lock

Antworten:

35

Es ist schwer, eine generische Antwort darauf zu geben. Es hängt wirklich von der Anzahl der Faktoren ab:

  • Welche Größe hat deine Reihe?
  • Welche Art von Daten speichern Sie (Zeichenfolgen, Blobs, Zahlen)?
  • Was machen Sie mit Ihren Daten (behalten Sie sie einfach als Archiv, fragen Sie sie regelmäßig ab)
  • Haben Sie Indizes auf Ihrer Tabelle - wie viele
  • Was sind Ihre Serverspezifikationen?

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.

Rashack
quelle
13
Ich möchte den "größeren Alptraum der Wartung / Abfrage" verstärken - aus persönlicher Erfahrung würde ich vermeiden, mich in Tabellen wie die Pest aufzuteilen.
Daniel James Bryars
91

Dies sind einige der Spezifikationen für die maximale Kapazität für SQL Server 2008 R2

  • Datenbankgröße: 524.272 Terabyte
  • Datenbanken pro Instanz von SQL Server: 32.767
  • Dateigruppen pro Datenbank: 32.767
  • Dateien pro Datenbank: 32.767
  • Dateigröße (Daten): 16 Terabyte
  • Dateigröße (Protokoll): 2 Terabyte
  • Zeilen pro Tabelle: Begrenzt durch verfügbaren Speicherplatz
  • Tabellen pro Datenbank: Begrenzt durch die Anzahl der Objekte in einer Datenbank
Malak Gerges
quelle
21
Ich würde vermuten, dass wenn Sie mehr als 9.223.372.036.854.775.807 Zeilen haben, Sie jedoch auf Probleme stoßen würden (maximale Größe von a bigint)
Martin Smith
10
Haben Sie jemals die Anzahl der Jahre berechnet, die erforderlich wären, um diese Zeilenanzahl bei den 100000 Zeilen / Tag zu erreichen, die das OP erwähnt hat?
Erwin Smout
74
Posting this for the faul: 252.695.124 Jahre.
NotMe
17
@NotMe Nicht wiederzubeleben und zu picken, aber ich habe 252695124297 Jahre. (Manchmal wünschte ich, ich wäre von der faulen Bevölkerung, auf die Sie sich bezogen haben)
Philthyfool
3
@philthyfool Ein Tag für das Schaltjahr ist ein großer Unterschied. Ich bekomme 252.522.163.911. Außerdem waren dies vollkommen gute Minuten meines Lebens, die ich jetzt nicht zurückbekommen kann.
Suamere
52

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

Reihenanzahl

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.

Dan Bechard
quelle
13
Bis zu 10,5 Milliarden tuckern immer noch. Versuchen Sie einfach nicht, COUNT () auszuführen. ;)
Dan Bechard
6
Es ist ein Jahr her, wir sind bei 16,5 Milliarden Zeilen. Wir haben gerade eine zusätzliche Datenquelle hinzugefügt, damit sie jetzt etwas schneller wächst. Wir haben diese Datenbank auch in eine eigene SQL-Instanz verschoben, damit wir Speicher reservieren können, ohne die anderen Datenbanken auf dem Server zu beeinträchtigen. Ich bin immer noch in der Lage, jeden Datenpunkt über einen Zeitraum von 24 Stunden in den letzten 3 Jahren in weniger als einer Sekunde aufzuzeichnen. Unsere Analysten lieben es.
Dan Bechard
Ich weiß, es ist eine Weile her, aber können Sie mir sagen, auf welcher Art von Hardware Sie diese Datenbank ausgeführt haben? Sehr neugierig, da wir eine Tabelle mit 5 Milliarden Zeilen haben, die jährlich um 1 Milliarde wächst, und ik gerne herausfinden möchte, ob dies in Zukunft problematisch wird
Jeroen1984,
3
@ Jeroen1984 Es handelt sich um eine virtuelle Maschine, die auf einem Hyper-V-Host ProLiant DL360e Gen8 mit zwei Intel (R) Xeon (R) CPU E5-2430-Prozessoren ausgeführt wird. Die VM verfügt über 38 GB statisch zugewiesenen RAM und einige virtuelle Prozessoren, an die ich mich nicht erinnere.
Dan Bechard
19

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.

Sascha
quelle
19

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.

paxdiablo
quelle
5

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.

Nicht ich
quelle
4

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.

Nathan
quelle
3

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.

Kennzeichen
quelle
2

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
0

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.

buckaroo1177125
quelle
2
Ich bin mir nicht sicher, ob dies wirklich eine Antwort ist.
Andrew Barber
-1
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
Ravi
quelle
Ich habe diese Abfrage ausgeführt und dieses Ergebnis erhalten. Ich habe eine UrlCategories-Tabelle in meiner Datenbank. Was bedeutet dieses Ergebnis? Name TableRows L10_TableRows UrlCategories 7 0.85
Aditya Bokade
-4

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.

Sameer
quelle
4
Ich bin mir nicht sicher, wie dies eine Antwort auf die gestellte Frage ist.
Andrew Barber