it-swarm.com.de

Spaltengröße ändern dauert sehr lange?

Ich habe eine Tabelle mit 45 Millionen Zeilen (45 GB Datenraum und 2 GB Indexraum). Ich habe eine neue Spalte hinzugefügt und sie wurde sofort beendet.

alter table T add C char(25)

Dann habe ich festgestellt, dass die Größe zu klein ist, sodass ich die folgende Abfrage ausführe.

alter table T alter column C varchar(2500)

Und es läuft eine Stunde und läuft noch. sp_whoisactive zeigt (im Moment läuft noch)

reads: 48,000,000
writes: 5,000,000
physical reads: 3,900,000

Sollte es nicht wirklich schnell gehen?

7
u23432534

Angenommen, alle zuvor erstellten Spalten haben eine feste Breite wie char und datetime. Wenn Sie die Spalte C oben hinzufügen, wird sie am Ende des Abschnitts mit fester Breite des Datensatzes hinzugefügt ( effektiv eine Nur-Meta-Änderung). Für die Neufassung als varchar musste es jedoch in den Abschnitt mit variabler Breite des Datensatzes verschoben werden, wodurch eine implizite Neuerstellung der Tabelle erzwungen wurde. Paul Randal erklärt die Interna von Datensätzen ausführlich in Innerhalb der Speicher-Engine: Anatomie eines Datensatzes .

10
MattyZDBA

Ich habe den Fall getestet. Sie können dies schneller tun, indem Sie die folgenden Schritte ausführen:

  1. Erstellen Sie dieselbe Tabellenstruktur mit einem anderen Namen (nennen Sie es Tbl2).
  2. Ändern Sie die Spalte auf Tbl2
  3. daten von Tbl1 in Tbl2 einfügen
  4. Drop Tbl1 (die alte Tabelle)
  5. Benennen Sie Tbl2 (das neue) in Tbl1 um

Dies gibt Ihnen eine viel bessere Leistung.

Der Grund dafür ist, dass das Ändern der Spalte in der Tabelle, die Daten enthält, viel Datenübertragung und Ausrichtung der Datenseiten erfordert. Mit meiner Lösung fügen Sie einfach Daten ohne Seitenreorganisation ein.

Edit :
In meinem Test habe ich eine Tabelle mit ca. 40 Mio. Zeilen, Tabellengröße 7 GB und Indexgröße 2,5 GB verwendet. Die vorgeschlagene Methode war 1 Minute gegenüber 4 Minuten, als ich das Feld in der Originaltabelle umbenannte

7
user71787