Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server-Leistung für Alter Table Alter Column Change Data Type

Zufällig musste ich vor ca. 3 Stunden etwas sehr ähnliches machen. Der Tisch hatte 35 Meter Reihen, er ist ziemlich breit, und es hat ewig gedauert, nur das zu tun:

alter table myTable add myNewColumn int not null default 0;

Hier ist, was ich am Ende gemacht habe:

alter table myTable add myNewColumn int null;

while 1=1
begin
    update top (100000) myTable
    set
        myNewColumn = 0
    where
        myNewColumn is null;

    if @@ROWCOUNT = 0 break;
end

alter table myTable alter column myNewColumn int not null;
alter table myTable add constraint tw_def_myNewColumn default (0) for myNewColumn;

Diesmal die alter table Aussagen waren fast sofort. Es dauerte ungefähr 7-8 Minuten (auf einem langsamen Server), um die Update-Batches durchzuführen. Ich spekuliere, dass SQL Server in meiner ursprünglichen Abfrage ein Undo generiert hat, um die Werte wiederherzustellen, aber ich habe nicht damit gerechnet, dass ich damit angefangen habe.

Wie auch immer, in Ihrem Fall würde vielleicht etwas Ähnliches helfen. Sie könnten versuchen, eine neue Bigint-Spalte hinzuzufügen, die neue Spalte in Stapeln zu aktualisieren und dann die Einschränkungen dafür festzulegen.