SQL Server alter table, um TEXT in NVARCHAR (MAX) zu ändern, wodurch die Datenbankgröße erheblich erhöht wird

8

Ich muss eine SQL Server-Datenbank mit einer Größe von ca. 18 GB aktualisieren, um eine signifikante Anzahl von TEXTSpalten in zu ändern NVARCHAR(MAX).

Das Problem, das ich habe, ist, dass alter tabledie Datenbank nach dem Ausführen aller Befehle fast 26 GB groß ist. Ich verstehe, dass die Verwendung von hier aus NVARCHAR(MAX)die DB langsamer wachsen lässt, aber gibt es eine Möglichkeit für mich, dieses Aufblähen zu verhindern?

Aidan Lawless
quelle
2
Oh, stellen Sie hier nicht die gleiche Frage. Kennzeichnen Sie es einfach auf SO und Mods werden es sofort hierher migrieren :-). Jetzt muss jemand zusammenführen / bereinigen usw.
Marian
2
Ist die Datenbank größer oder ist das Protokoll sehr groß?
Aaron Bertrand
Sorry Marian, verstehe jetzt ...
Aidan Lawless
Aaron, die MDF-Datei ist viel größer ... fast 10 GB größer
Aidan Lawless

Antworten:

7

Ich gehe davon aus, dass dieser Beitrag Ihnen weiterhelfen wird.

http://geekswithblogs.net/johnsPerfBlog/archive/2008/04/16/ntext-vs-nvarcharmax-in-sql-2005.aspx

Wichtige Fakten:

  • Standardmäßig speichern TEXT und NTEXT den Textwert in der LOB-Struktur
  • Standardmäßig speichert NVARCHAR (MAX) den Textwert in der Tabellenstruktur (es sei denn, er ist größer als 8000 Byte).
  • Wenn Sie die Spalte von TEXT / NTEXT in NVARCHAR (MAX) ändern, wird die Art und Weise, wie die Daten gespeichert werden, nicht geändert. Es werden nur die Tabellenmetadaten aktualisiert. Die Datenstruktur wird erst beim nächsten Ändern des Werts geändert. Dies kann sofort erfolgen, indem Sie Folgendes ausführen:

      update mytable set mycolumn1 = mycolumn1
  • Wenn Sie die Standardeinstellung für Tabellenoptionen für NVARCHAR (MAX) verwenden, sind die Daten in Ihrer Tabelle größer.

    - Sie müssen sich die Einstellungen und die Umgebung Ihrer Tabellenoptionen ansehen, bevor Sie die Einstellung an Ihre Bedürfnisse anpassen können.

  • Ihre Tabellengröße wird schließlich kleiner, wenn Sie Ihrer Anweisung alter table die Anweisung update table folgen.

Kurz gesagt, wenn Sie die Update-Anweisung ausführen und die Änderung des Speichers der Datenstruktur erzwingen, wird Ihre Datenbankgröße erwartungsgemäß kleiner.

EDIT : Wie Sie TEXT und nicht NTEXT erwähnt haben, wäre Ihr Platzgewinn weniger offensichtlich, als Sie vielleicht denken. NTEXT benötigt doppelt so viel Speicherplatz wie TEXT. Gleichzeitig sollten Sie davon ausgehen, dass NVARCHAR (MAX) etwa die Hälfte des Speicherplatzes einnimmt wie NTEXT. Nach meiner Berechnung würden Sie kaum Änderungen gegenüber Ihrer ursprünglichen Datenbankgröße feststellen.


Besonderer Kredit an http://www.douglubey.com/

RoKa
quelle
2
Können Sie hier die wichtigen Fakten zusammenfassen, falls der Link tot sein könnte?
Stephane Rolland
Wie in anderen Antworten erwähnt, wirkt sich TEXT vs. NTEXT auf den Speicher aus, jedoch nicht so stark, wie Sie vorgeschlagen haben.
RoKa
Danke ... Ich habe den Beitritt seit Jahren verschoben ... Ich bin froh, hier zu sein.
RoKa
Vielen Dank an RoKA, das hat einige der fraglichen Tabellen erheblich verändert. Ich werde die Datenbank erneut wiederherstellen und schrittweise vorgehen, um die Auswirkungen zu sehen. Nochmals vielen Dank .....
Aidan Lawless
Es ist mir ein Vergnügen.
RoKa
6

Könnte ein Versehen in Ihrer Frage sein, aber Sie sagen TEXT zu NVARCHAR (max) und nicht NTEXT zu NVARCHAR (max). Wenn Sie dies wirklich tun, wechseln Sie von ANSI zu UNICODE, und Sie sollten sich nicht wundern, dass mehr Platz benötigt wird (Einzelbytezeichen gegenüber Mehrbytezeichen).

spaghettidba
quelle
Ja, das ist es, was ich tue ... obwohl es auf der Grundlage einiger einfacher Berechnungen nicht die Größe des Anstiegs berücksichtigen würde.
Aidan Lawless
2
Haben Sie es mit RoKas Vorschlag versucht?
Spaghettidba
1
@AidanLawless welche Berechnungen sind das? Die Größe der Datenbank sollte mindestens um die Größe des vorhandenen TEXTFelds zunehmen. Das Wechseln zu Unicode benötigt genau das Doppelte des Speicherplatzes von ANSI.
JNK
2
@JNK ... es sei denn, Sie verwenden die Komprimierung in 2008 R2 oder besser, wobei die Unicode-Komprimierung in NVARCHAR gespeicherte ASCII-Zeichen wie VARCHAR behandelt.
Aaron Bertrand