Copiare quantità enorme da 1 tavolo all'altro
-
16-10-2019 - |
Domanda
Ho due tabelle con stessa struttura che ho bisogno di copiare tutte le tabelle dalla tabella A alla tabella B, il problema è che alcuni record di tabella A: esistono già nella tabella B in modo che ha reso l'importazione Fail.
Così ho fatto una query per fare l'importazione (anche utilizzando la configurazione in strumento di importazione) del genere
SELECT * from TransactionEntryN
WHERE TransactionEntryN.TransactionEntryID
NOT IN (select TransactionEntryID FROM TransactionEntry)
Il problema è che questa operazione richiede 13 min. per copiare solo 50K dischi e ho 16 milioni di dischi lì, mi ci vorrebbero una settimana per finire che ...
C'è un modo più veloce per farlo?
btw la chiave primaria TransactionEntryID è un uniqueidentifier che potrebbe rallentarlo? (Non posso cambiarlo Mi chiedo solo se questo il problema.
Soluzione
Se si desidera che la seconda tabella per contenere gli stessi dati come la prima tabella, perché non è sufficiente pulire il tavolo fuori e sostituirlo?
BEGIN TRANSACTION;
DROP TABLE TransactionEntry;
SELECT * INTO dbo.TransactionEntry FROM dbo.TransactionEntryN
-- other WHERE clauses?
;
COMMIT TRANSACTION;
-- create indexes / permissions etc.
Altri suggerimenti
Rimuovi tutte le righe che si trovano nella tabella B e non nella tabella A. Quindi si potrebbe usare DOTNET SqlBulkCopy per copiare i dati dalla tabella A alla tabella B. E 'piuttosto veloce. Per 100.000 record ci sarebbe voluto meno di 10 secondi. Sto scrivendo alcuni pseudo codice qui. Se volete un esempio di lavoro completo si potrebbe andare a http://technico.qnownow.com/2012/03/27/using-sql-bulk-copy-to-efficiently-load-data-from -source-db-to-destination-db /
// Open a sourceConnection
using (SqlConnection sourceConnection =
new SqlConnection(GetSourceConnectionString()))
{
sourceConnection.Open();
// Get the data from the source table as a SqlDataReader.
SqlCommand commandSourceData = new SqlCommand(
@"SELECT *
FROM dbo.tableA;", sourceConnection);
SqlDataReader reader =
commandSourceData.ExecuteReader();
// Open the destination connection.
using (SqlConnection destinationConnection =
new SqlConnection(GetDestinationConnectionString()))
{
destinationConnection.Open();
using (SqlBulkCopy bulkCopy =
new SqlBulkCopy(destinationConnection))
{
bulkCopy.DestinationTableName =
"dbo.tableB";
try
{
bulkCopy.WriteToServer(reader);
}
finally
{
reader.Close();
}
}
}
}
}