Скопируйте огромную сумму из 1 таблицы до других
-
16-10-2019 - |
Вопрос
У меня есть две таблицы с той же структурой, которую мне нужно скопировать по всем таблицам из таблицы A до таблицы B, проблема в том, что некоторые записи из таблицы A уже существуют в таблице B, так что это сделало импорт.
Поэтому я сделал запрос на то, чтобы сделать импорт (также использование инструмента «Сборка в импорте»)
SELECT * from TransactionEntryN
WHERE TransactionEntryN.TransactionEntryID
NOT IN (select TransactionEntryID FROM TransactionEntry)
Проблема в том, что эта операция занимает 13 минут. Чтобы скопировать всего 50 тысяч записей, и у меня там 16 миллионов записей, мне потребуется неделя, чтобы закончить это ...
Есть ли более быстрый способ сделать это?
Кстати, первичный ключ 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-effectully-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();
}
}
}
}
}