Question

J'ai deux tables avec une même structure que je dois copier sur toutes les tables de la table A à la table B, le problème est que certains enregistrements de la table A existent déjà dans le tableau B de sorte que l'importation fait échec.

Je fait une requête pour faire l'importation (en utilisant également la construction dans l'outil d'importation) comme

SELECT * from TransactionEntryN
WHERE TransactionEntryN.TransactionEntryID 
NOT IN (select TransactionEntryID FROM TransactionEntry)

Le problème est que cette opération prend 13 min. de copier seulement 50K dossiers et j'ai 16 millions de disques là-bas, il me faudrait une semaine pour terminer que ...

Y at-il moyen plus rapide de le faire?

BTW la clé primaire TransactionEntryID est un UNIQUEIDENTIFIER qui peut ralentir? (Je ne peux pas changer, je me demande si cela la question.

Était-ce utile?

La solution

Si vous voulez que la deuxième table contient les mêmes données que la première table, pourquoi ne pas simplement essuyer la table dehors et le remplacer?

BEGIN TRANSACTION;

  DROP TABLE TransactionEntry;

  SELECT * INTO dbo.TransactionEntry FROM dbo.TransactionEntryN
    -- other WHERE clauses?
  ;

COMMIT TRANSACTION;
-- create indexes / permissions etc.

Autres conseils

Supprimer toutes les lignes qui sont dans le tableau B et non dans le tableau A. Vous pouvez ensuite utiliser DOTNET SqlBulkCopy pour copier les données de la table A à la table B. Il est assez rapide. Pour 100.000 dossiers, il faudrait moins de 10 secondes. Je suis en train d'écrire un code de pseudo ici. Si vous voulez un exemple de travail complet, vous pouvez aller à http://technico.qnownow.com/2012/03/27/using-sql-bulk-copy-to-efficiently-load-data-from -source-db à 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();
                    }
                }
            }
        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top