2016-10-12 5 views
0

Ich habe eine Tabelle mit über 20 Millionen Zeilen. Ich möchte die Breite einer Spalte von nvarchar(100) zu nvarchar(50) mit minimaler Ausfallzeit reduzieren. Die Verwendung von Azure SQL premium 1 SKU dauert mit dem Befehl alter table eine Stunde.SQL Server: wie man eine Spaltenbreite mit minimaler Ausfallzeit reduziert

Eine Option, die ich mir vorstellen kann, ist, eine neue Spalte zu erstellen und die Daten in Batches (sagen wir 100k) zu kopieren. Nehmen Sie schließlich eine exklusive Sperre, kopieren Sie die neuen Zeilen, die möglicherweise aufgetreten sind, und benennen Sie die Spalten anschließend um.

Gibt es einen besseren Weg, dies zu tun?

+0

Warum? 'NVARCHAR' benötigt den benötigten Speicherplatz, einige Bytes Overhead ... Wenn die Daten in dieser Spalte nicht größer als 50 sind, wird es nicht viel bewirken ... Wenn es längere Strings gibt, werden Sie diese abschneiden. .. Wenn Sie nur sicherstellen möchten, dass Daten nicht länger als 50 am einfachsten sind, fügen Sie eine 'CHECK'-Einschränkung hinzu ... – Shnugo

+0

Ich muss einen zusammengesetzten Index erstellen, der die Schlüssellänge überschreitet, also muss ich die Breite ändern. –

+0

Hmm, ich kenne Ihren Tisch nicht, aber ein so großer Index mit 20 Millionen Zeilen klingt nicht gut ... Raum spielt keine Rolle - offensichtlich - Sie könnten also einfach eine persistente berechnete Spalte hinzufügen und diese in Ihrem verwenden index ... – Shnugo

Antwort

3

die Tabelle als Online-Betrieb Alter:

alter table t1 alter column c1 varchar(50) with (online=on) 
+0

Das funktioniert .... alter Tisch dauerte über 1 Stunde, aber ich konnte in der Zwischenzeit in den Tisch einfügen. –

0

Erstellen Sie eine Kopie von bestehenden mit geänderter Breite und machen Sie eine Insert-Auswahl, sobald Sie fertig sind, legen Sie die alte Tabelle ab und benennen Sie die neue Tabelle wieder in alte Tabelle um.

Verwandte Themen