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

So kopieren Sie Daten einer großen Tabelle in eine andere Tabelle in SQL Server

Ich hatte das gleiche Problem, außer dass ich eine Tabelle mit 2 Milliarden Zeilen habe, sodass die Protokolldatei ins Unendliche wachsen würde, selbst wenn das Wiederherstellungsmodell auf Massenprotokollierung eingestellt wäre:

insert into newtable select * from oldtable

Also arbeite ich mit Datenblöcken. Auf diese Weise starten Sie die Übertragung einfach neu, wenn sie unterbrochen wird. Außerdem benötigen Sie keine Protokolldatei, die so groß ist wie die Tabelle. Sie scheinen auch weniger tempdb I/O zu bekommen, nicht sicher warum.

set identity_insert newtable on
DECLARE @StartID bigint, @LastID bigint, @EndID bigint
select @StartID = isNull(max(id),0) + 1
from newtable

select @LastID = max(ID)
from oldtable

while @StartID < @LastID
begin
    set @EndID = @StartID + 1000000

    insert into newtable (FIELDS,GO,HERE)
    select FIELDS,GO,HERE from oldtable (NOLOCK)
    where id BETWEEN @StartID AND @EndId

    set @StartID = @EndID + 1
end
set identity_insert newtable off
go

Möglicherweise müssen Sie ändern, wie Sie mit IDs umgehen. Dies funktioniert am besten, wenn Ihre Tabelle nach ID geclustert ist.