Was ist der effizienteste Weg, um eine Spaltendefinition in einer Tabelle mit Millionen von Zeilen zu ändern?

9

Ich muss eine Spalte in einer Tabelle, die Millionen von Zeilen enthält, von NOT NULL in NULL ändern. Ich habe es einfach versucht

alter table Table1 ALTER COLUMN Column1 XML NULL

aber es dauert ewig. Also hier sind meine Fragen:

  1. Warum dauert es so lange, die Änderung anzuwenden?
  2. Gibt es einen besseren Weg, dies zu tun?
Jonas Stawski
quelle

Antworten:

3

1) Man würde mehr Informationen über die vollständige Struktur der Tabelle + nicht gruppierte Indizes benötigen, um richtig herauszufinden, was passiert, aber mein Verdacht hat etwas mit der NULL-Bitmap zu tun.

Weitere Informationen zum Thema finden Sie unter. http://www.sqlskills.com/BLOGS/PAUL/post/Misconceptions-around-null-bitmap-size.aspx

http://www.sqlskills.com/BLOGS/PAUL/post/A-SQL-Server-DBA-myth-a-day-(630)-three-null-bitmap-myths.aspx

2) Ja, vorausgesetzt, Sie verfügen über Speicherplatz, erstellen Sie eine neue Tabelle mit korrekter Nullbarkeit und übertragen Sie die Daten in mehreren Stapeln, um übermäßiges Protokollwachstum zu vermeiden, und wechseln Sie die Tabelle mithilfe der unten aufgeführten Technik. Ich habe dies mehrmals mit wenig bis gar keinen Ausfallzeiten gemacht.

http://jahaines.blogspot.com/2009/12/sql-server-2005-how-to-move-10-millions.html

Sankar Reddy
quelle
6

Wäre es schneller zu:

  1. Erstellen Sie eine neue Tabelle mit der richtigen Definition für Column1
  2. INSERT INTO <NewTable> SELECT * FROM <OriginalTable>;;
  3. Benennen Sie OriginalTable in OriginalTable_old um. Benennen Sie NewTable in OriginalTable um
  4. Überprüfen Sie OriginalTable_old und löschen Sie es

Der Vorteil hierbei ist, dass Sie die Originaltabelle für die Dauer des Vorgangs nicht sperren. Die Tabelle sollte nur während der Umbenennungsphase gesperrt werden. (Es wird davon ausgegangen, dass SQL Server eine Umbenennung auf Objektebene unterstützt.)

RobPaller
quelle
Ja, SQL Server unterstützt das Umbenennen auf Objektebene mithilfe der gespeicherten Systemprozedur sp_rename.
Gonsalu
Auf diese Weise konnte ich innerhalb von 1 Minute eine Spalte mit 3,5 Millionen Zeilen ändern.
Mohsen Afshin
2

Jede Zeile muss berührt werden, wenn die Spalte von NOT NULL in NULL geändert wird, weshalb die Fertigstellung so lange dauert. Es gibt keine Möglichkeit, weniger Zeit in Anspruch zu nehmen.

mrdenny
quelle
1

Eine andere Möglichkeit besteht darin, eine neue Spalte mit der richtigen Definition für die betreffende Tabelle zu erstellen. Aktualisieren Sie die Spalte mit Daten aus der alten Spalte und löschen Sie die alte Spalte.

Oder Sie können auf einen älteren Beitrag von SE verweisen, der ein ähnliches Problem in einer INT-Spalte behandelt.

/programming/4311559/sql-server-performance-for-alter-table-alter-column-change-data-type

yrushka
quelle
In meinem Fall ist meine Spalte einfach voll mit NULL-Werten. Ich denke, dies wäre der richtige Weg. Das Erstellen einer neuen, vollständig NULL-Spalte mit dem richtigen Namen sollte keine Zeit in Anspruch nehmen. Dann wird die alte Spalte gelöscht. anstatt sich mit Millionen von Beilagen zu befassen ...
Zack
0

Wenn Sie den SQL-Aktivitätsmonitor öffnen, während der Befehl ausgeführt wird, können Sie feststellen, ob er tatsächlich verarbeitet wird oder ob er auf eine exklusive Sperre der Tabelle wartet.

Matthew Steeples
quelle