Frage

Ich habe eine Tabelle auf SQL Server 2005, die über 4 GB Größe war.

(etwa 17 Millionen Datensätze)

Ich änderte eines der Felder von Datentyp char(30) char(60) (es gibt insgesamt 25 Felder von denen die meisten char(10) so die Menge an char Raum summiert sich auf etwa 300)

Dies verursachte die Tabelle in der Größe (über 9 GB) zu verdoppeln

Ich änderte dann den char(60) varchar(60) und lief dann eine Funktion aus den Daten zusätzliche Leerzeichen zu schneiden

(um die durchschnittliche Länge der Daten im Bereich bis etwa 15 zu reduzieren)

Das hat die Tischgröße nicht reduzieren. die Datenbank schrumpf hat auch nicht geholfen.

Kurz tatsächlich die Tabellenstruktur neu zu erstellen und das Kopieren der Daten über (das sind 17 Millionen Datensätze!) Gibt es eine weniger drastische Weise die Größe wieder nach unten zu bekommen?

War es hilfreich?

Lösung

Nun, es ist klar, Sie keinen Platz zurück bekommen! : -)

Wenn Sie Ihre Textfelder CHAR (60) geändert werden, werden sie alle, um die Kapazität mit Leerzeichen aufgefüllt. Also alle Ihre Felder sind jetzt wirklich 60 Zeichen lang sein.

Ändern Sie das zurück zu VARCHAR (60) wird nicht helfen - die Felder sind immer noch alle 60 Zeichen lang ....

Was Sie wirklich tun müssen, ist eine TRIM-Funktion über alle Felder laufen sie zurück in ihre getrimmt Länge zu reduzieren, und dann eine Datenbank tun schrumpfen.

Nachdem Sie das getan haben, müssen Sie Ihre gruppierten Index, um neu zu erstellen, dass einige der verschwendeten Speicherplatz zurückzufordern. Der Clustered-Index ist wirklich, wo Ihre Daten lebt - Sie es wie folgt neu erstellen können:

ALTER INDEX IndexName ON YourTable REBUILD 

Standardmäßig ist Ihr Primärschlüssel ist Ihr gruppierten Index (sofern Sie nichts anderes angegeben haben).

Marc

Andere Tipps

Sie haben keine Daten gereinigt oder verdichtet, auch mit einem „schrumpfen Datenbank“.

DBCC CLEAN

  

Gewinnt Raum aus sank Spalten mit variabler Länge in Tabellen oder indizierten Sichten.

Allerdings ist ein einfacher Index neu erstellen < em>, wenn ein Clustered-Index ist sollte es auch tun,

ALTER INDEX ALL ON dbo.Mytable REBUILD

A arbeitete Beispiel von Tony Rogerson

Ich weiß, ich bin der Beantwortung Ihre Frage nicht, wie Sie fragen, aber haben Sie als einen Teil der Daten zu einer Verlaufstabelle Archivierung und mit weniger Zeilen arbeiten?

Die meisten der Zeit könnte man auf den ersten Blick denken, dass Sie diese Daten alle brauchen die ganze Zeit, aber wenn tatsächlich Hinsetzen und dessen Prüfung, gibt es Fälle, in denen das nicht wahr ist. Oder zumindest habe ich diese Situation erlebt vor.

Ich hatte ein ähnliches Problem hier SQL Server, Konvertieren von NTEXT zu NVARCHAR (MAX) , die an sich ändernde ntext- zu nvarchar (max) bezogen wurde.

Ich hatte eine UPDATE MyTable SET MyValue = MyValue zu tun, um, um es alles schön zu ändern.

Das ist offensichtlich dauert ziemlich lange Zeit mit vielen Aufzeichnungen. Es gab eine Reihe von Vorschlägen, wie man besser, es zu tun. Der Schlüssel war eine temporäre Flag angezeigt, wenn es oder nicht getan worden war und dann ein paar tausend in einer Zeit, in einer Schleife zu aktualisieren, bis alles fertig war. Das bedeutete, ich hatte „einige“ Kontrolle darüber, wie viel es tat.

Auf einer anderen Anmerkung aber, wenn Sie wirklich die Datenbank so viel wie möglich verkleinern möchten, kann es helfen, wenn Sie das Wiederherstellungsmodell bis zu einfachen drehen, die Transaktionsprotokolle schrumpfen, werden alle Daten auf den Seiten neu zu organisieren, dann setzen Sie es zurück zum vollständigen Wiederherstellungsmodell. Seien Sie vorsichtig, der Datenbanken schrumpfen in der Regel nicht ratsam, und wenn Sie das Wiederherstellungsmodell einer Live-Datenbank reduzieren Sie bitten um etwas schief gehen.

Alternativ können Sie eine vollständige Tabelle gibt es keine zusätzlichen Daten um überall hängen, um sicherzustellen, tun neu zu erstellen:

CREATE TABLE tmp_table(<column definitions>);
GO
INSERT INTO tmp_table(<columns>) SELECT <columns> FROM <table>;
GO
DROP TABLE <table>;
GO
EXEC sp_rename N'tmp_table', N'<table>';
GO

Natürlich, werden die Dinge komplizierter mit Identität, Indizes, etc etc ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top