Überlegungen beim Löschen von Spalten in großen Tabellen

9

Ich habe eine Tabelle mit Anrufdaten, die auf 1,3 Milliarden Zeilen und 173 Gigabyte Daten gewachsen ist. Es gibt zwei Spalten, die wir nicht mehr verwenden, eine ist char (15) und die andere ist varchar (24). Sie haben beide seit einiger Zeit mit NULL eingefügt, ich habe es verschoben, die Spalten zu entfernen, weil ich mir der Implikationen nicht sicher bin. Wir haben begrenzten Speicherplatz auf dem Laufwerk mit der Datenbank und dem Laufwerk mit dem Transaktionslog.

Zusätzlich fand ich Dieser Beitrag sagt, dass der Space nicht verfügbar wäre, bevor ein DBCC REINDEX ausgeführt wurde. Ich sehe das sowohl als gut als auch als schlecht. Es ist gut, weil das Löschen der Spalten sehr schnell sein sollte und nicht viel Protokollierung erfordert, aber schlecht, weil der Speicherplatz nicht zurückgewonnen wird. Werden neu eingefügte Aufzeichnungen weniger Platz einnehmen? Das wäre in meinem Fall in Ordnung, da wir die alten Daten nach 18 Monaten beschneiden, so dass der Speicherplatz allmählich abnimmt.

Wenn wir einen DBCC REINDEX (oder ALTER INDEX REBUILD) machen würden, würde das wirklich helfen, da die Spalten nicht Teil eines Indexes sind? Würde das Protokoll Speicherplatz belegen oder die Tabelle sperren, damit sie nicht verwendet werden kann?

    
Jason Goemaat 23.02.2011, 00:26
quelle

2 Antworten

3

Ich habe Ihre Frage interessant gefunden und beschlossen, sie in einer Entwicklungsdatenbank zu modellieren. SQL Server 2008, Datenbankgröße 400 MB, Protokoll 2,4 GB. Ich nehme an, dass Sie aus dem angegebenen Link eine Tabelle mit Clustered Index erstellt haben:

%Vor%

Diese Tabelle besteht aus 12 Millionen Datensätzen.

%Vor%

Drop-Spalten

%Vor%

Die Tabellengröße bleibt gleich. Datenbank und Protokollgröße blieben gleich.

fügen Sie dem Rest der Tabelle 3 Millionen Zeilen hinzu

%Vor%

Datenbankgröße 500 MB, log 3.27 GB.

Nach

%Vor%

Das Protokoll hat dieselbe Größe, aber die Datenbankgröße wurde auf 866 MB erhöht.

%Vor%

Fügen Sie erneut 3 Millionen Zeilen hinzu, um zu sehen, ob sie in den verfügbaren Speicherplatz innerhalb der Datenbank gehen. Datenbankgröße ist die gleiche, log 3.96 Gb, die deutlich zeigt, sind sie.

Ich hoffe, es macht Sinn.

    
Pavel Nefyodov 23.02.2011, 10:30
quelle
0

Nein, neu eingefügte Datensätze würden nicht weniger Platz einnehmen. Ich habe mir heute genau dieses Problem angeschaut.

Testtabelle

%Vor%

Offsets Abfrage

%Vor%

Ausgangszustand der Tabelle

%Vor%

Nehmen Sie jetzt einige Änderungen vor

%Vor%

Schau noch einmal auf den Tisch

%Vor%

Fügen Sie eine Zeile ein und sehen Sie sich die Seite an

%Vor%

Gibt

zurück %Vor%

Sie können sehen, dass die gelöschten (und geänderten) Spalten immer noch Platz verbrauchen, obwohl die Tabelle tatsächlich leer war, als das Schema geändert wurde.

Die Auswirkungen der gelöschten Spalten in Ihrem Fall sind 15 Bytes für char 1 und 2 Bytes für varchar eins verschwendet, es sei denn ist die letzte Spalte in der Variablen Abschnitt, wenn es keinen Platz braucht.

    
Martin Smith 28.02.2011 23:57
quelle

Tags und Links