Spaltengröße ändern dauert sehr lange?


7

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?

Antworten:


10

Angenommen, alle zuvor erstellten Spalten haben eine feste Breite, charund datetimewenn Sie eine Spalte hinzufügen, fügen Sie sie Ceinfach am Ende des Abschnitts mit fester Breite des Datensatzes hinzu (praktisch eine Nur-Meta-Änderung). Bei einer Neufassung varcharmuss es jedoch in den Abschnitt mit variabler Breite des Datensatzes verschoben werden, wodurch eine implizite Neuerstellung der Tabelle erzwungen wird. Paul Randal erklärt die Interna von Datensätzen ausführlich in Inside the Storage Engine: Anatomie eines Datensatzes .


Danke, ich vermutete, dass der Tisch wieder aufgebaut wurde. Ich habe jedoch festgestellt, dass die Anzahl der Schreibvorgänge 8 KB größer war als der Datenbereich + Indexbereich und noch ausgeführt wurde.
U23432534

@ u23432534 Schreibvorgänge können auch andere Dinge wie Protokoll, Arbeitstisch, Arbeitsdatei usw. umfassen.
Aaron Bertrand

@AaronBertrand Schade, dass ich die Sitzung beendet habe, nachdem festgestellt wurde, dass die Schreibvorgänge meine berechnete Anzahl überschritten haben. Es wird jedoch immer noch der ausführbare Status angezeigt. Ich denke, ich werde die Spalte löschen und neu erstellen und sie sollte sofort fertig sein.
U23432534

7

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.

Bearbeiten:
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

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.