2010-09-07 4 views
1

Я использую SQL Server 2005 для разработки пакета SSIS. Мой поток данных содержит поиск SSIS. Каждая из строк, которые я обрабатываю, имеет эти столбцы (среди прочих): ID1, detailsID1, ID2, detailsID2. Значение столбца detailsID1 должно быть загружено из поиска на основе ID1, а значение для detailsID1 из другого поиска на основе ID2. Дело в том, что эти два поиска идентичны: я делаю один и тот же выбор для тех же столбцов в одной таблице (ID1 и ID2 - это некоторые идентификаторы записей, содержащихся в одной таблице). Есть ли способ, которым я могу использовать только один поиск для загрузки обоих столбцов данных? Я не хочу использовать 2 поиска, потому что эта таблица огромна.Поиск SSIS с переменными условиями

У вас есть идеи о том, как я могу это сделать? Любая идея очень ценится!

+0

Если вы близки к обновлению до 2008 года, но еще нет веских аргументов - вот и все. У SSIS 2008 есть «преобразование кеша», которое позволит вам это сделать. Вы заполняете кеш вручную, а затем можете использовать этот кеш несколько раз. –

+0

Это звучит здорово, но, к сожалению, нам еще предстоит пройти долгий путь, пока не дойдем до 2008 года. – Diana

ответ

1

Компонент Lookup может быть болью для больших таблиц. Вы можете попробовать несколько вариантов.

Во-первых, используйте оператор SQL, который присоединяет таблицу поиска к исходным данным. Для этого потребуется несколько задач потока данных. Ваш существующий поток данных будет выводиться в таблицу промежуточного назначения в базе данных. Затем вы можете создать новый поток данных, где источником является запрос, который объединяет вашу таблицу поиска один раз для каждого поиска в промежуточную таблицу. Примером запроса может быть:

SELECT lt1.detailsID1, lt2.detailsID2, <other StagingTable columns> 
FROM StagingTable st 
LEFT OUTER JOIN LookupTable lt1 ON st.ID1 = lt1.ID1 
LEFT OUTER JOIN LookupTable lt2 ON st.ID2 = lt2.ID2 

Результаты поиска завершены как часть SQL-запроса.

Другой вариант - выполнить процесс соединения с использованием компонентов потока данных. Обратите внимание, что на этом компьютере будет много памяти на компьютере, на котором запущен пакет SSIS.

Используя текущий поток данных, добавьте новый источник, который получает данные из таблицы поиска. Добавьте компонент Multicast в поток данных и создайте путь потока данных от источника к входу Multicast.

Добавить компонент объединения Merge и добавить выход из первичного источника в качестве левого ввода и добавить первый многоадресный выход в качестве правого входа. Обратите внимание, что входы уже должны быть отсортированы в последовательности ключа соединения (ID1 для первого соединения и ID2 для второго соединения - см. Ниже). Настройте объединение Merge Join как левое внешнее соединение с совпадением столбцов ID1. Включите столбец DetailID1 на выходе

Добавить компонент «Сортировка» и второй слияние. Результат первого объединения Merge переходит к компоненту Sort. Установите ключ сортировки в столбец ID2. Выход Sort переходит ко второму компоненту Merge Join в качестве входа Left join. Второй выход Multicast поступает на второй вход Merge Join. Сконфигурируйте второе объединение Присоединить то же самое, что и первый Merge Join, но для столбца ID2.

alt text

Как вы можете видеть, этот процесс намного больше работы. Первое решение, вероятно, будет вашим лучшим решением, но вы должны сравнить решения для лучшей производительности.

+0

Огромное вам спасибо за ваш ответ. Я как-то надеялся на более прямой подход :). Поскольку мне нужно, чтобы это было быстро, и мне нужно сделать это быстро (менее 1 дня), я пойду на 2 поиска с включенным кешированием - не самый лучший вариант, но это вариант. Еще раз спасибо за ваш ответ! – Diana

+0

Вот случай из блога Тодда Макдермида для множественного поиска. http://toddmcdermid.blogspot.com/2010/09/parallelism-in-ssis-multiple-lookups.html – CTKeane

+0

Хорошая статья, спасибо, что привлек ее к моему вниманию. – Diana

Смежные вопросы