Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak skopiować dane z ogromnej tabeli do innej tabeli w SQL Server

Miałem ten sam problem, z wyjątkiem tego, że mam tabelę z 2 miliardami wierszy, więc plik dziennika rozrósłby się bez końca, gdybym to zrobił, nawet przy modelu odzyskiwania ustawionym na Logowanie zbiorcze:

insert into newtable select * from oldtable

Więc operuję na blokach danych. W ten sposób, jeśli transfer zostanie przerwany, po prostu go zrestartujesz. Ponadto nie potrzebujesz pliku dziennika tak dużego jak tabela. Wydaje się również, że masz mniej wejścia/wyjścia tempdb, nie wiesz dlaczego.

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

Być może trzeba będzie zmienić sposób postępowania z identyfikatorami, działa to najlepiej, jeśli tabela jest pogrupowana według identyfikatorów.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konwertuj „datetime2” na „date” w SQL Server (przykłady T-SQL)

  2. Przewodnik dla początkujących po tablicach SQL

  3. Ulubione triki dostrajania wydajności

  4. SQL Server zablokował dostęp do procedury „sys.sp_OACreate” składnika „Ole Automation Procedures”

  5. Jak sp_describe_first_result_set działa w programie SQL Server