Sql-Server-2005
將大量從一張桌子復製到另一張桌子
我有兩個具有相同結構的表,我需要將所有表從表 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(); } } } } }