Я относительно новичок в SSIS и знаю, что обработка дубликатов — это часто повторяющийся вопрос, поэтому заранее благодарю вас за то, что прочитали мою стену текста и за любую помощь в моей сложной ситуации.
У меня есть небольшая таблица из 18179 строк (назовем ее Destination), которую необходимо обновить с помощью SSIS с помощью плоского файла. Плоский файл из 18179 строк, который я тестирую, содержит только те записи, которые существуют в месте назначения и были изменены. В настоящее время у меня есть пакет, который загружает промежуточную таблицу (назовем ее Stage) из плоского файла, а затем переходит к потоку данных и поиску.
Этот поток данных берет этап и выполняет поиск LKP_OrderID из этапа в пункте назначения, используя первичный ключ OrderID, чтобы проверить, существует ли запись. Если OrderID не существует в Destination, то он следует по пути New OrderID, и запись вставляется в Destination в DST_OLE_Dest.
Вот где у меня возникла проблема: если OrderID действительно существует в Destination, то он следует пути Existing OrderID. Команда CMD_Delete_Duplicates OLE DB выполняет:
DELETE d
FROM dbo.Destination d
INNER JOIN dbo.Stage s ON d.OrderID = s.OrderID
Это должно удалить все записи из Destination, которые существуют в Stage. Затем он должен вставить обновленную версию этих записей из Stage в DST_OLE_Desti. Однако кажется, что он обрабатывает 18179 строк в 2 пакета: в первом пакете обрабатывается 9972 строки.
Затем во втором пакете обрабатываются оставшиеся 8207 строк. Он показывает, что он вставил все 18179 строк в пункт назначения, но в конечном итоге я получил только последний пакет из 8207 строк в пункте назначения.
Я полагаю, что он удаляет и вставляет 1-й пакет из 9972 строк, затем снова запускает вышеуказанное удаление из SQL внутреннего соединения для 2-го пакета из 8207 строк, непреднамеренно удаляя только что вставленные 9972 строки и оставляя меня с 8207.
Я обнаружил, что максимизация DefaultBufferSize до 104857600 байт и увеличение DefaultBufferMaxRows в потоке данных таким образом, чтобы пакет одновременно обрабатывал все 18179 строк, правильно удаляет и вставляет все 18179, но как только мои данные превысят размер файла 104857600, это снова будет проблема. Я также могу использовать преобразование команды OLE DB для запуска
DELETE FROM dbo.Destination WHERE OrderID = ?
Это должно передать OrderID из Stage и удалить из Destination, где есть совпадение, но это занимает много времени и занимает ~ 10 минут для этой небольшой таблицы. Есть ли другие решения этой проблемы? Как мне выполнить обновление, а не вставить и удалить, если это лучший вариант?