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.

È stato utile?

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();
                    }
                }
            }
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top