Вопрос

У меня есть две таблицы с той же структурой, которую мне нужно скопировать по всем таблицам из таблицы 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();
                    }
                }
            }
        }
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top