2009-08-16 2 views
0

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

Что я хочу сделать, это две вещи: (1) Чтобы консольное приложение (или пакет SSIS) было многопоточным, чтобы у меня было несколько таких запусков, чтобы обновление завершилось быстрее. Он должен быть умным и иметь возможность выбирать клиентов таким образом, чтобы два потока никогда не выполняли код для одного и того же клиента.

(2) Если новый клиент подписывается, ему не нужно ждать час или пока консольное приложение не получит его для получения данных. Должен быть другой процесс/приложение, которое имеет очередь новых клиентов и проводит анализ на этом. Проблема в том, что я хочу, чтобы эта очередь не запускала код для клиента, если почасовой процесс также запускает код в этом процессе.

Из того, что я читал на предыдущих потоках здесь, SSIS - это то, что я хочу использовать. Это верно? Является ли SSIS правильным инструментом?

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

Спасибо!

ответ

3

SSIS - это правильный инструмент. Правильный способ сделать это - создать задачу Data Flow и не беспокоиться о многопоточности. SSIS позаботится об этом для вас, особенно для SSIS 2008.

Степень, в которой вам приходится беспокоиться, заключается в том, что вам нужно знать, что для определенных преобразований потока данных требуется, чтобы все входные строки обрабатывались до их создания вывода на всех. Например, преобразование сортировки должно ждать, пока все строки не будут переданы ему, выполните сортировку и затем начнут передавать отсортированные строки. Если вы избегаете таких преобразований, SSIS будет очень рад оптимизировать количество используемых потоков.


Что касается приоритетного вопроса, я не думал об этом, но как насчет того, чтобы пакетная работа игнорировала новых клиентов. Еще один пакет SSIS выполняется чаще, чтобы выполнить обработку в новых строках, а затем отметьте, что они были обработаны в первый раз. Таким образом, конфликта не может быть.

0

Я не уверен, что SSIS - это путь. Вы можете сделать это, используя чистый T-SQL.

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

Используйте UPDLOCK, ROWLOCK, READPAST для консольного приложения для управления выбором строки: "Processing Data Queues in SQL Server with READPAST and UPDLOCK".

Каждый процесс теперь имеет строку (неблокирующую, но исключительную), и ее можно обрабатывать.

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

Вы даже можете использовать цикл WHILE внутри, чтобы просто продолжить обработку. Установите его, вот и все. Если он не найдет строк, вы можете создать WAITFOR.

Лично я не использовал SSIS.

+0

Пожалуйста, скажите _why_, вы бы не использовали SSIS. В частности, как ваши методы решают его проблемы с производительностью? –

+0

Легко. SSIS является громоздким для такого рода задач, и вам все равно потребуется SQL для безопасного доступа к данным. Так почему бы не сделать это в SQL вместо того, чтобы выгружать другой инструмент? Учитывая, что это INSERT .. SELECT на некоторых эксклюзивных строках, разве это не то, для чего предназначен SQL? Что может сделать SSIS для этого необработанного T-SQL? – gbn

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