От новичка до гуру: Курсы программирования на CyberDuff

SSIS — удалить существующие строки, затем вставить, неполный результат

Я относительно новичок в 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 минут для этой небольшой таблицы. Есть ли другие решения этой проблемы? Как мне выполнить обновление, а не вставить и удалить, если это лучший вариант?

10.12.2014

Ответы:


1

Да, у тебя проблемы с логикой. Ваша команда OLE DB запускает этот оператор удаления для КАЖДОЙ строки, которая проходит через него.

Вместо этого вы хотели бы, чтобы этот шаг был прецедентом (выполнение задачи SQL) для потока данных. Это очистит существующие данные в целевой таблице, прежде чем вы начнете загружать ее. В противном случае вы отмените только что загруженные данные, как вы и заметили.

Существуют разные подходы к решению этой проблемы. Если удаляет работу, то держитесь за нее. В противном случае люди обычно выполняют обновления вторичной таблицы, а затем используют задачу «Выполнение SQL» в качестве преемника задачи потока данных и выполняют обновление на основе набора.

10.12.2014
  • Сделал только это, и похоже, что это сработало как шарм. Спасибо! 12.12.2014

  • 2

    Вы можете использовать инструмент «Медленно изменяющееся измерение» из набора инструментов SSIS для обновления строк (в отличие от удаления и повторной вставки). Судя по звуку, у вас есть только изменения «Типа 1», поэтому вам не нужно будет использовать вывод вставки исторических атрибутов.

    Он автоматически позаботится об обоих потоках в вашей иллюстрации — вставках и обновлениях.

    10.12.2014
    Новые материалы

    Отслеживание состояния с течением времени с дифференцированием снимков
    Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

    Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
    Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..

    Игра в прятки с данными
    Игра в прятки с данными Я хотел бы, чтобы вы сделали мне одолжение и ответили на следующие вопросы. Гуглить можно в любое время, здесь никто не забивается. Сколько регионов в Гане? А как..

    «Раскрытие математических рассуждений с помощью Microsoft MathPrompter и моделей больших языков»
    TL;DR: MathPrompter от Microsoft показывает, как использовать математические рассуждения с большими языковыми моделями; 4-этапный процесс для улучшения доверия и рассуждений в математических..

    Раскройте свой потенциал в области разработки мобильных приложений: Абсолютная бесплатная серия
    Глава 6: Работа в сети и выборка данных Глава 1: Введение в React Native Глава 2: Основы React Native Глава 3: Создание пользовательского интерфейса с помощью React Native Глава 4:..

    Все о кейсах: Camel, Snake, Kebab & Pascal
    В программировании вы сталкивались с ними при именовании переменной, класса или функции. Поддержание согласованности типов и стилей случаев делает ваш код более читабельным и облегчает совместную..

    Как работает дистанционное парное программирование и почему оно может изменить вашу жизнь
    Серебряная пуля от одиночества и отвлекающих факторов во время обучения программированию Независимо от того, работаете ли вы или учитесь удаленно, велика вероятность, что одиночество и..