2009-06-05 13 views
3

Ich habe eine große Tabelle in SQL Server 2005, die etwa 3,5 GB Speicherplatz (nach sp_spaceused) benötigt. Es hat 10 Millionen Datensätze und mehrere Indizes.SQL Server 2005: Speicherplatz durch abgelegte Spalten

Ich habe gerade eine Reihe von Spalten daraus gelöscht, so dass die Rekordlänge auf die Hälfte reduziert wurde, und zu meiner Überraschung brauchte es null Zeit, um das zu tun. Offensichtlich hat sp_spaceused immer noch den gleichen belegten Speicherplatz gemeldet, der SQL Server hat beim Löschen der Spalten nicht wirklich etwas getan, außer dass er sie als "gelöscht" markiert hat.

Also habe ich alle Daten aus dieser Tabelle in eine andere neue Tabelle verschoben, abgeschnitten und alle Daten zurück verschoben, so dass alles rekonstruiert wurde.

Nun, die Daten nehmen 2,8 GB, das ist weniger als zuvor, aber ich habe einen größeren Rückgang erwartet.

Ist es möglich, dass die Tatsache, dass diese Tabelle ursprünglich diese Spalten enthielt, immer noch etwas zurücklässt?

Wurde abgeschnitten es nicht genug? Soll ich es fallen lassen und mit dem kleineren Spaltensatz neu anlegen?

Oder nehmen die Daten wirklich 2,8 GB?

Danke!

Antwort

2

Wie haben Sie berechnet, dass "ein größerer Tropfen erwartet"? Beachten Sie, dass die Daten in 8-KByte-Seiten vorliegen, was bedeutet, dass selbst wenn einzelne Zeilen kleiner sind, dies nicht immer bedeutet, dass Sie weniger Seiten benötigen, um sie zu speichern. Zum Beispiel (ein extremes Beispiel), wenn Ihre Zeilen zu je 7.5K waren, würde nur eine Zeile pro Seite passen. Sie löschen einige Spalten, Ihre Zeile ist 5K, aber es ist immer noch eine Zeile pro Seite.

4

Sie müssen den Clustered-Index neu erstellen (vorausgesetzt, Sie haben einen - standardmäßig ist der Primärschlüssel der Clustered-Schlüssel).

ALTER INDEX (your clustered index) ON TABLE (your table) REBUILD 

Die Daten sind wirklich die Blattebene des gruppierten Index - wenn Sie es wieder aufzubauen, wird es „verdichtet“ und die Zeilen sollten sich auf viel weniger Datenseiten gespeichert werden, die Größe Ihrer Datenbank zu reduzieren, auch.

Wenn das überhaupt nicht hilft, müssen Sie möglicherweise auch eine DBCC SHRINKDATABASE in Ihrer Datenbank ausführen, um den Speicherplatz wirklich zurückzugewinnen. Diese zwei Schritte zusammen sollten Sie wirklich eine kleinere Datenbankdatei bekommen!

Marc

+0

Und wenn man davon ausgeht, dass es sich um eine 3.5GB-Tabelle handelt, wäre dieser Vorgang in Ordnung, wenn das System läuft? – marquito

+1

@marquito: es wird eine Ausfallzeit benötigen, um diesen Vorgang abzuschließen - natürlich - umsonst. –

+0

danke, @marc_s. Da ich mit der gleichen Situation konfrontiert bin, ist es gut zu wissen, dass ich warten muss, um die Prozedur auszuführen oder die Konsequenzen zu tragen. :) – marquito