Sql-Server-2005

將大量從一張桌子復製到另一張桌子

  • March 27, 2012

我有兩個具有相同結構的表,我需要將所有表從表 A 複製到表 B,問題是表 A 中的某些記錄已經存在於表 B 中,因此導致導入失敗。

所以我做了一個查詢來做導入(也使用導入工具中的建構)

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

問題是這個操作需要 13 分鐘。要複製 50K 條記錄,而我那裡有 1600 萬條記錄,我需要一周時間才能完成…

有沒有更快的方法來做到這一點?

順便說一句,主鍵 TransactionEntryID 是一個可能會減慢速度的唯一標識符?(我無法更改它,我只是想知道這是否是問題所在。

如果您希望第二個表包含與第一個表相同的數據,為什麼不簡單地將表清除並替換它呢?

BEGIN TRANSACTION;

 DROP TABLE TransactionEntry;

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

COMMIT TRANSACTION;
-- create indexes / permissions etc.

刪除表 B 中而不是表 A 中的所有行。然後您可以使用 DOTNET SQLBulkCopy 將數據從表 A 複製到表 B。它非常快。對於 100,000 條記錄,只需不到 10 秒。我在這裡寫了一些虛擬碼。如果您想要一個完整的工作範例,您可以訪問http://technico.qnownow.com/2012/03/27/using-sql-bulk-copy-to-efficiently-load-data-from-source-db-to -目的地-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();
                   }
               }
           }
       }
   }

引用自:https://dba.stackexchange.com/questions/15352