2017-12-27 23 views
1

Ich fragte mich, ob jemand mir einen Zeiger mit dem Problem geben könnte. Ich nehme an, dass andere dies bereits erlebt haben und sich gefragt haben, was am effizientesten ist.Beste/effizienteste Art, Nvarchar (max) in nvarchar (30) zu konvertieren

Ich habe Produktionsdaten, die zur Verarbeitung ziemlich lange dauern, hauptsächlich weil wir keine Indizes für ein ID-Feld festgelegt haben.

Das ID-Feld ist derzeit ein Nvarchar (max), daher kann es nicht indiziert werden. Diese ID ist nie länger als 30 Zeichen, und ich möchte daher den Datentyp in nvarchar (30) ändern. Ich habe jedoch bemerkt, dass mit einer Anweisung wie folgt:

ALTER TABLE [dbo].[Table] ALTER COLUMN [Column1] NVARCHAR (30) NOT NULL 

Nimmt eine erhebliche Menge an Zeit für die kleineren Tabellen bereits. Ich mache mir Sorgen, dass es nicht einmal für die größeren Tische funktioniert, da das DiskIO bereits für die kleineren Tische unglaublich hoch ist.

Wäre das Folgende schneller und könnte es funktionieren?

  • Erstellen Sie eine neue Spalte mit dem Datentyp nvarchar (30).
  • Kopieren Sie dann die Daten aus der Spalte nvarchar (max) in die Spalte nvarchar (30).
  • Entfernen Sie dann die Spalte nvarchar (max).
  • Benennen Sie dann die Spalte nvarchar (30) in den Namen der Spalte nvarchar (max) um?

Hat jemand irgendwelche Vorschläge, was könnte noch besser sein?

Alle Hinweise/Hilfe wäre willkommen!

+0

ich an eine andere Stelle, die Daten zu kopieren würde vorschlagen, um die Tabelle Kürzen, um den Datentyp zu ändern, und re- Einfügen der Daten. Sie werden den letzten Teil mit der Protokollierung auf der minimalen Ebene oder mit dem 'bulk insert' machen wollen. –

+0

Mögliches Duplikat von [SQL Server-Leistung für alter table alter column change data type] (https://stackoverflow.com/questions/4311559/sql-server-performance-for-alter-table-alter-column-change-data- Geben Sie) – Joey

Antwort

2

Wir lösen ein ähnliches Problem durch eine leere neue Spalte (NULL) und

in Chargen Aktualisierung Erstellung
update top (5000) myTable --parentheses are mandatory, set a small number to avoid transaction log issues 
set newCol = oldCol -- or left(oldCol,30) not sure your data 
where newCol is null 

go 10000 --runs 10,000 times, set accordingly to your rows amount, this covers 50 million rows(5,000x10,000) 
+0

Danke, ich werde das versuchen und zurück zu Ihnen, um zu sehen, ob es funktioniert! – Mark

+0

Das funktioniert, danke! – Mark

+0

Ich bin froh, dass es geholfen hat! Nur neugierig, wie viele Zeilen waren da? – Horaciux

Verwandte Themen