sql >> Database >  >> RDS >> Sqlserver

Hoe een enorme tabelgegevens naar een andere tabel in SQL Server te kopiëren?

Ik had hetzelfde probleem, behalve dat ik een tabel heb met 2 miljard rijen, dus het logbestand zou oneindig groeien als ik dit deed, zelfs als het herstelmodel was ingesteld op Bulk-Logging:

insert into newtable select * from oldtable

Dus ik opereer op datablokken. Op deze manier, als de overdracht wordt onderbroken, herstart je hem gewoon. U hebt ook geen logbestand nodig dat zo groot is als de tabel. Je lijkt ook minder tempdb I/O te krijgen, ik weet niet waarom.

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

Mogelijk moet u de manier waarop u met ID's omgaat, wijzigen, dit werkt het beste als uw tabel is geclusterd op ID.



  1. Wat is de verbindingsreeks voor localdb voor versie 11

  2. Verschil tussen datetime en timestamp in sqlserver?

  3. Vergelijk twee MySQL-databases

  4. Een identiteit toevoegen aan een bestaande kolom