Come copiare i dati di una tabella enorme in un’altra tabella in SQL Server

Ho una tabella con 3,4 milioni di righe. Voglio copiare questi dati interi in un’altra tabella.

Sto svolgendo questa attività utilizzando la query seguente:

select * into new_items from productDB.dbo.items 

Ho bisogno di sapere il modo migliore per fare questo compito.

Se stai copiando in una nuova tabella, il modo più rapido è probabilmente quello che hai nella tua domanda, a meno che le tue righe non siano molto grandi.

Se le tue righe sono molto grandi, potresti voler utilizzare le funzioni di inserimento di massa in SQL Server. Penso che puoi chiamarli da C #.

Oppure puoi prima scaricare i dati in un file di testo, quindi eseguire il bulk-copy (bcp). Questo ha l’ulteriore vantaggio di permetterti di ignorare chiavi, indici, ecc.

Prova anche l’utilità di importazione / esportazione fornita con SQL Management Studio; non sono sicuro se sarà veloce come una copia in serie, ma dovrebbe consentire di saltare il passaggio intermedio di scrittura come un file flat e copiare semplicemente direttamente da tavolo a tabella, il che potrebbe essere un po ‘più veloce di la tua SELECT INTO .

Ho avuto lo stesso problema, ad eccezione del fatto che ho una tabella con 2 miliardi di righe, quindi il file di log diventerebbe infinito se lo facessi, anche con il modello di recupero impostato su Bulk-Logging:

 insert into newtable select * from oldtable 

Quindi lavoro su blocchi di dati. In questo modo, se il trasferimento è interrotto, devi solo riavviarlo. Inoltre, non è necessario un file di registro grande quanto la tabella. Sembra anche che abbia meno I / O tempdb, non è sicuro del perché.

 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 

Potrebbe essere necessario modificare la modalità di gestione degli ID, questo funziona meglio se la tabella è raggruppata per ID.

Ho lavorato con il nostro DBA per copiare una tabella di controllo con 240 milioni di righe in un altro database.

Utilizzando un semplice select / insert creato un enorme file tempdb.

Utilizzando una procedura guidata di importazione / esportazione ha funzionato, ma ha copiato 8 milioni di righe in 10 minuti

Creazione di un pacchetto SSIS personalizzato e regolazione delle impostazioni copiate di 30M righe in 10Min

Il pacchetto SSIS si è rivelato il più veloce ed efficiente per i nostri scopi

Conte

Ecco un altro modo per trasferire tabelle grandi. Ho appena trasferito 105 milioni di file tra due server utilizzando questo. Molto veloce anche

  1. Fare clic con il tasto destro del mouse sul database e selezionare Attività / Esporta dati .
  2. Una procedura guidata ti guiderà attraverso i passaggi ma sceglierai il tuo client SQL server poiché l’origine dati e la destinazione ti permetteranno di selezionare il database e le tabelle che desideri trasferire.

Per ulteriori informazioni, consultare https://www.mssqltips.com/sqlservertutorial/202/simple-way-to-export-data-from-sql-server/

Se si tratta di un’importazione di 1 ora, l’utilità di importazione / esportazione in SSMS probabilmente funzionerà nel modo più semplice e veloce. Anche SSIS sembra funzionare meglio per importare set di dati di grandi dimensioni rispetto a un INSERT dritto.

BULK INSERT o BCP possono anche essere utilizzati per importare set di record di grandi dimensioni.

Un’altra opzione sarebbe quella di rimuovere temporaneamente tutti gli indici e i vincoli sulla tabella in cui si sta importando e di aggiungerli una volta completato il processo di importazione. Un dritto INSERIMENTO che in precedenza non funzionava potrebbe funzionare in questi casi.

Se si ha a che fare con timeout o blocchi / blocchi quando si passa direttamente da un database a un altro, si potrebbe prendere in considerazione l’idea di passare da un database in TEMPDB e passare da TEMPDB all’altro database, in quanto riduce al minimo gli effetti dei processi di blocco e blocco su entrambi i lati. TempDB non bloccherà né bloccherà la fonte e non manterrà la destinazione.

Queste sono alcune opzioni da provare.

-Eric Isaacs

Semplice inserimento / selezione del lavoro di sp grande finché il conteggio delle righe supera 1 mil. Ho visto esplodere il file tempdb cercando di inserire / selezionare 20 mil + righe. La soluzione più semplice è SSIS che imposta il buffer delle dimensioni della riga batch su 5000 e memorizza il buffer delle dimensioni su 1000.

seleziona * in new_items dal prodottoDB.dbo.items

È praticamente così. Questo è il modo più efficace per farlo.