Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Le prestazioni di SQL Server per modificare la tabella alterano il tipo di dati di modifica della colonna

Per coincidenza, ho dovuto fare qualcosa di molto simile circa 3 ore fa. La tabella era di 35 milioni di righe, è abbastanza ampia e ci voleva un'eternità per farlo:

alter table myTable add myNewColumn int not null default 0;

Ecco con cosa ho finito:

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;

Questa volta, la alter table le dichiarazioni sono state quasi istantanee. Ci sono voluti circa 7-8 minuti (su un server lento) per eseguire i batch di aggiornamento. Sto ipotizzando che SQL Server stia generando undo nella mia query originale per ripristinare i valori, ma non mi aspettavo che iniziasse.

Comunque, nel tuo caso, forse qualcosa di simile aiuterebbe. Potresti provare ad aggiungere una nuova colonna bigint, aggiornare la nuova colonna in batch, quindi impostare i vincoli su di essa.