sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man kopierar en enorm tabelldata till en annan tabell i SQL Server

Jag hade samma problem, förutom att jag har en tabell med 2 miljarder rader, så loggfilen skulle växa oändligt om jag gjorde detta, även med återställningsmodellen inställd på Bulk-logging:

insert into newtable select * from oldtable

Så jag opererar på datablock. På så sätt, om överföringen avbryts, startar du bara om den. Dessutom behöver du inte en loggfil så stor som tabellen. Du verkar också få mindre tempdb I/O, inte säker på varför.

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

Du kan behöva ändra hur du hanterar ID, detta fungerar bäst om din tabell är grupperad efter ID.



  1. GATHER_PLAN_STATISTICS genererar inte grundläggande planstatistik

  2. Hur tolkas sql med rekursivt uttalande?

  3. EXECUTE...USING-satsen i PL/pgSQL fungerar inte med posttyp?

  4. Oracle sammanfogar sträng- och nummerexempel