2013-01-24 5 views
11

Ich habe eine Testdatenbank mit 1 Tabelle mit etwa 50 Millionen Datensätzen. Der Tisch hatte anfangs 50 Spalten. Die Tabelle enthält keine Indizes. Wenn ich die Prozedur "sp_spaceused" ausführe, erhalte ich "24733.88 MB" als Ergebnis. Jetzt, um die Größe dieser Datenbank zu reduzieren, entferne ich 15 Spalten (meistens int-Spalten) und führe den "sp_spaceused" aus, ich bekomme immer noch "24733.88 MB" als Ergebnis.Das Löschen der Spalte reduziert die Datenbankgröße nicht

Warum verringert sich die Datenbankgröße nicht, nachdem so viele Spalten entfernt wurden? Fehle ich hier etwas?

Edit: Ich habe versucht, Datenbank schrumpft aber es half auch nicht

Antwort

19

Versuchen Sie den folgenden Befehl ausführen:

DBCC CLEANTABLE ('dbname', 'yourTable', 0) 

Es wird Speicherplatz aus fallen gelassen Spalten mit variabler Länge in Tabellen oder indizierten Sichten. Weitere Informationen finden Sie hier DBCC CLEANTABLE und hier Space used does not get changed after dropping a column

Auch, wie richtig auf den Link auf den ersten Kommentar zu dieser Antwort geschrieben hingewiesen. Nachdem Sie den DBCC CLEANTABLE-Befehl ausgeführt haben, müssen Sie Ihren Clustered-Index neu erstellen, falls die Tabelle über einen solchen verfügt, um den Speicherplatz zurückzuerhalten.

ALTER INDEX IndexName ON YourTable REBUILD 
+1

Ich fand eine ähnliche Lösung unter diesem Link: http://stackoverflow.com/questions/807579/how-to-reduce-size-of-sql-server-table-that-grew-from-a-datatype-change Ich versuche es jetzt! Vielen Dank! – Vinod

+0

@Vinod, wenn es nützlich war, vergessen Sie nicht, das Häkchen zu überprüfen, damit andere sicher sein können, dass es die richtige Antwort war. – Yaroslav

+0

Nun, ich habe die Abfrage ausgeführt und die Datenbank wuchs auf 45 GB. Ich lief Shrink-Datenbank erneut, dann ist es wieder auf die ursprüngliche 24733.88MB zurückgekommen. Ich bin mir nicht sicher, was passiert !!! :-( – Vinod

1

Die Größe der Datenbank wird nicht nur schrumpfen, weil Sie Objekte gelöscht haben. Der Datenbankserver enthält normalerweise den zurückgewonnenen Speicherplatz, der für nachfolgende Dateneinfügungen oder neue Objekte verwendet werden soll.

Um den freigegebenen Speicherplatz freizugeben, müssen Sie die Datenbankdatei verkleinern. Siehe How do I shrink my SQL Server Database?

+0

Wie ich in meinem bearbeiten erwähnt, ich habe bereits versucht, meine Datenbank schrumpft und Protokolldateien. Es hat nicht geholfen! – Vinod

3

Wenn eine Spalte mit variabler Länge aus der Tabelle gelöscht wird, wird die Größe der Tabelle nicht reduziert. Die Tabellengröße bleibt gleich, bis Indizes neu organisiert oder neu erstellt werden.

Es gibt auch den DBCC-Befehl DBCC CLEANTABLE, der verwendet werden kann, um jeden zuvor mit Spalten variabler Länge belegten Speicherplatz zurückzufordern. Hier ist die Syntax:

DBCC CLEANTABLE ('MyDatabase','MySchema.MyTable', 0)WITH NO_INFOMSGS; 
GO 

Raj

Verwandte Themen