テーブルAからテーブルBにすべてのテーブルをコピーする必要がある同じ構造の2つのテーブルがあります。問題は、テーブルAの一部のレコードがテーブルBにすでに存在しているため、インポートが失敗したことです。
だから私はそのようなインポートを行うためのクエリを作成しました(インポートツールのビルドも使用しています)
SELECT * from TransactionEntryN
WHERE TransactionEntryN.TransactionEntryID
NOT IN (select TransactionEntryID FROM TransactionEntry)
問題は、この操作に13分かかることです。 5万件のレコードだけをコピーし、そこに1,600万件のレコードがある場合、それを完了するのに1週間かかります...
それを行うためのより速い方法はありますか?
ところで、主キーTransactionEntryIDは、それを遅くする可能性のあるuniqueidentifierですか? (私はそれを変更することはできません、私はそれが問題かどうか疑問に思っています。
2番目のテーブルに最初のテーブルと同じデータを含める場合は、テーブルをワイプして置き換えてみませんか?
BEGIN TRANSACTION;
DROP TABLE TransactionEntry;
SELECT * INTO dbo.TransactionEntry FROM dbo.TransactionEntryN
-- other WHERE clauses?
;
COMMIT TRANSACTION;
-- create indexes / permissions etc.
テーブルAではなくテーブルBにあるすべての行を削除します。その後、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-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();
}
}
}
}
}