sql >> Databáze >  >> RDS >> Sqlserver

Jak zkopírovat data velké tabulky do jiné tabulky v SQL Server

Měl jsem stejný problém, až na to, že mám tabulku se 2 miliardami řádků, takže kdybych to udělal, soubor protokolu by se rozrostl do nekonečna, i když je model obnovy nastavený na hromadné protokolování:

insert into newtable select * from oldtable

Takže operuji s bloky dat. Tímto způsobem, pokud je přenos přerušen, stačí jej restartovat. Také nepotřebujete soubor protokolu tak velký jako tabulka. Také se zdá, že dostáváte méně tempdb I/O, nevím proč.

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

Možná budete muset změnit způsob zacházení s ID. To funguje nejlépe, pokud je tabulka seskupená podle ID.



  1. Zkombinujte více výsledků v poddotazu do jedné hodnoty oddělené čárkami

  2. Je lepší vytvořit index před naplněním tabulky daty, nebo poté, co jsou data na svém místě?

  3. Jak provedu hromadné vložení do mySQL pomocí node.js

  4. Entity Framework 6 s Npgsql