it-swarm.com.de

Die Größe der SQL Server-Datenbank wurde nach dem Löschen einer großen Anzahl von Zeilen nicht verringert.

Ich bin nicht gut in SQL, aber ich muss eine Datenbank pflegen.

Da fast kein Platz mehr dafür vorhanden ist, habe ich beschlossen, alle Daten für beispielsweise das Jahr 2008 zu löschen. Nachdem ich die Löschabfrage (ca. 10 000 000 Zeilen bereinigt) und das Bereinigungstransaktionsprotokoll ausgeführt habe, habe ich festgestellt, dass meine Aktionen hatten keinen Einfluss auf die Datenbankgröße. Muss ich noch etwas tun?

30
Marat

Das Schrumpfen ist in der Tat aus den hier genannten Gründen gefährlich. Es gibt ein glückliches Medium zwischen Jimbos Antwort und Johns Antwort ... Sie sollten immer ernsthaft darüber nachdenken, ob Sie Ihre Datenbank verkleinern möchten oder nicht.

In einer idealen Welt würden Sie Ihre Datenbank mit viel freiem Speicherplatz erstellen, in den Sie hineinwachsen können. Ich nenne das "Richtige Größe" Ihrer Datenbank. Sie würden zulassen, dass dieser freie Speicherplatz vorhanden ist, und nicht danach streben, ihn zurückzugeben und Ihre Gesamtgröße auf der verwendeten Größe zu halten. Warum? Weil Ihre Datenbank irgendwann wieder wachsen wird. Dann werden Sie wieder schrumpfen. Und Sie werden in diesem schrecklichen Muster nutzloser Schrumpfungen stecken bleiben, gefolgt von Wachstum - und die ganze Zeit, wie einige darauf hingewiesen haben, werden Sie es sein Erhöhen Sie Ihre Indexfragmentierung.

Ich habe darüber gebloggt, wo ich die Leute ermahnte, " Berühren Sie nicht diesen Schrumpfknopf! ", aber manchmal ... Manchmal müssen Sie. Wenn Sie über eine große Datenbank verfügen, nur erheblichen Speicherplatz freigegeben haben und nicht damit rechnen, jemals wieder in diese Datenbank hineinzuwachsen, ist es in Ordnung, das Verkleinern als einmalige Operation zu betrachten, solange Sie sich anschließend durch Neuerstellung um Ihre Indexfragmentierung kümmern können Sie. Der Schrumpfvorgang kann zeitaufwändig sein, daher sollten Sie ihn für eine Zeit planen, in der Sie den Preis für einen Schrumpfvorgang bezahlen können. Der Ansatz, eine leere Datenbank zu erstellen und Daten in diese zu kopieren, funktioniert - bei größeren Datenbanken und vielen Daten kann dies jedoch sehr schwierig werden.

Wenn Sie planen, diesen Speicherplatz in Zukunft durch normale Nutzungs- und Wachstumsmuster wieder zur Datenbank hinzuzufügen, möchten Sie den Speicherplatz möglicherweise nur dort belassen.

Auch Sie sagten, Sie hätten Ihr Transaktionsprotokoll "gelöscht". Ich wäre gespannt, wie Sie das gemacht haben, aber wenn Sie den Beitrag lesen, den ich geteilt habe, und die anderen in der Serie, werden Sie einige Tipps zur Verwaltung von Transaktionsprotokollen sehen. Kurz gesagt: Wenn Sie sich im vollständigen Wiederherstellungsmodus befinden, sollten Sie regelmäßige Protokollsicherungen durchführen, damit das Protokoll selbst wiederverwendet wird. Andernfalls - ohne Protokollsicherungen im Vollmodus - wächst die Protokolldatei weiter und wächst und wächst immer und speichert immer das, was Sie getan haben, weil Sie SQL mitgeteilt haben, dass Sie dieses Protokoll nicht nur für die Wiederherstellung nach einem Absturz verwalten, sondern auch beibehalten möchten Manuelle Sicherung, um Transaktionen wiederzugeben/Transaktionen rückgängig zu machen, um sie zu Wiederherstellungszwecken zu einem bestimmten Zeitpunkt wiederherzustellen ... Wenn Sie einfach sind und sehen, dass das Protokoll übermäßig wächst, kann dies (normalerweise) ein Zeichen dafür sein, dass Sie eine Menge tun der Arbeit in einer Transaktion (ob Sie gesagt haben BEGIN TRAN ... do work.... COMMIT TRAN oder ob Sie gerade eine große DELETE Anweisung ausgegeben und eine ganze Menge Daten in einer impliziten Transaktion gelöscht haben.)

Ich gehe auch davon aus, dass Sie nach diesem freien Speicherplatz in Ihrem Dateisystem suchen. Wenn Sie in SQL und in der großen Datei, die Sie haben, danach suchen, kann es sein, dass Sie darauf warten, dass die Geisterbereinigung abgeschlossen ist, wenn Sie sofort nach Ihrem Vorgang suchen. Paul Randal bloggt über Ghost Cleanup .

18
Mike Walsh

Durch das Löschen von Zeilen in einer Datenbank wird die tatsächliche Größe der Datenbankdatei nicht verringert.

Sie müssen die Datenbank nach dem Löschen der Zeilen komprimieren.

SQL Server 2005 DBCC SHRINKDATABASE (Transact-SQL)

Nachdem Sie dies ausgeführt haben, möchten Sie die Indizes neu erstellen. Das Verkleinern führt normalerweise zu einer Indexfragmentierung, was erhebliche Leistungskosten verursachen kann.

Ich würde auch empfehlen, dass Sie die Dateien nach dem Verkleinern neu vergrößern, damit Sie freien Speicherplatz haben. Auf diese Weise lösen neue Zeilen kein automatisches Wachstum aus, wenn sie eingehen. Autogrowth hat Leistungskosten und sollte nach Möglichkeit vermieden werden (durch geeignete Datenbankgröße).

9
John Siu

SCHRINKEN SIE IHRE DATENBANK NICHT!

"Warum passiert das? Ein Vorgang zum Verkleinern von Datendateien funktioniert jeweils für eine einzelne Datei und verwendet die GAM-Bitmaps (siehe Inside The Storage Engine: GAM, SGAM, PFS und andere Zuordnungszuordnungen), um die höchste zugewiesene Seite in der Datei zu finden Datei. Anschließend wird es so weit wie möglich nach vorne in die Datei verschoben. Im obigen Fall wurde die Reihenfolge des Clustered-Index vollständig umgekehrt und von perfekt defragmentiert zu perfekt fragmentiert. ""

http://www.sqlskills.com/BLOGS/PAUL/post/Why-you-should-not-shrink-your-data-files.aspx

"Sehen Sie sich die Ironie der schrumpfenden Datenbank an. Eine Person verkleinert die Datenbank, um Speicherplatz zu gewinnen (sie glaubt, dass dies die Leistung verbessert), was zu einer Erhöhung der Fragmentierung (Verringerung der Leistung) führt. Um die Fragmentierung zu verringern, wird ein Index neu erstellt, der zu einer Größe von führt Die Datenbank sollte weit über die ursprüngliche Größe der Datenbank hinausgehen (vor dem Verkleinern). Nun, durch Verkleinern hat man nicht das gewonnen, wonach er normalerweise gesucht hat. "

http://blog.sqlauthority.com/2011/01/19/sql-server-shrinking-database-is-bad-increases-fragmentation-reduces-performance/

4
Jimbo

Wenn Sie Daten löschen, reserviert SQL Server seinen Speicherplatz für die spätere Verwendung zum Einfügen neuer Daten. Sie müssen die Datenbank verkleinern. Weitere Informationen finden Sie hier .

2
Amrinder Singh

Ich habe dies gefunden, weil ich gerade eine Reihe von Sicherungstabellen gelöscht habe, weil meine Datenbank "voll" war. Ich schaute weiter auf die "Size" -Eigenschaft und dachte warum wird das nicht kleiner?. Nachdem ich dies gelesen habe, nein, ich möchte die Datenbank nicht verkleinern. Was ich tun möchte, ist den Platz für den Müll, den ich gerade gelöscht habe, "zurückzugewinnen". Was ich mir ansehen musste, war "Space Available". Ich denke, vielleicht muss sich das auch jemand anderes ansehen.?

1
Josetta Caudill

Beachten Sie auch, dass nach dem Löschen großer Datenmengen eine Fragmentierung auftreten kann, wenn die Tabelle Indizes enthält. Ich hatte heute einen Tisch mit ~ 70 Millionen Datensätzen, der ungefähr 13 GB umfasste. Ich habe es auf 1639 Datensätze bereinigt (der Rest wurde durch einen einzelnen Fehler generiert), aber die Tabelle nahm immer noch etwa 4,5 GB ein. Nachdem ich alle Indizes in der Tabelle neu erstellt hatte, dauerte es nur 85 Seiten (680 KB). Danach habe ich inkrementelle Shrinkfile verwendet, um den Speicherplatz zurückzugewinnen (und den Fehler im System behoben, um eine Wiederholung zu verhindern).

0
G.Smith