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?


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/


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).


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.