Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
Стоит задача распараллеливания обработки данных. Например по каждому счету клиента надо провести уйму вычислений, сама задача по себе изолированна, и в настоящее время реализована в хранимке на MSSQL сервере (там где и данные). Проблема, как создать в SSIS цикл по счетам клиента, операции в котором будут выполнятся не синхронно, а асинхронно. Имея сервер на котором 2, а то и 4 процессора, было бы неплохо иметь возможность используя 4 коннекта к базе и 4 worker, построить нечто типа Producer Consumer Queue, в кооторой на входе очередь из вызовов по обрабоке каждого счета клиента а на выходе n workers, которые по мере выполнения полученных заданий берут из очереди очередное. Есть ли у кого опыт организации подобной обработки, может даже в других ETL (Data Stage, OWB). Написать свою компоненту на C# можно и даже есть написанная (только не как SSIS Custom Task), только стоит ли изобретать велосипед :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2005, 13:21 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
если процедура достаточно долгая, что можно пренебречь накладными расходами на создание джоба, то можно для каждого вызова создавать джоб и запускать уже его ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2005, 14:32 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
Dmitry Biryukovесли процедура достаточно долгая, что можно пренебречь накладными расходами на создание джоба, то можно для каждого вызова создавать джоб и запускать уже его На сколько долгая? Всего около 500000 дебиторских счетов, транзакций в рассматриваемом периоде около 15 миллионов. Причем есть дебиторы с 50000 тысячами транзакции, так и с 50 транзакций. Считается это на 4-х процессорнике 80 минут. Но 3 проца бездействуют. Диски тоже не в напряге. Сейчас это все написано на T-SQL, ессно все в одном вызове хранимки, из которой еще десяток вызывается. Вообщем пара-тройка тысяч строк на T-SQL (можешь представить, что собой представляет модификация и отладка - врагу не пожелал бы). Создавать 500000 джобов думаю было бы накладно. А вот асинхронный вызов таска в цикле SSIS думаю помог бы. Но как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2005, 14:58 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
а зачем 500000 джобов? разбейте клиентов на примерно равные части (по кол-ву обрабатываемых данных) и делайте кол-во джобов = кол-ву процессоров ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2005, 15:35 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
Dmitry Biryukovа зачем 500000 джобов? разбейте клиентов на примерно равные части (по кол-ву обрабатываемых данных) и делайте кол-во джобов = кол-ву процессоров 1. Это слишком в лоб и не красиво. 2. Не факт что чел. с 100 транзакциями рассчитывается в 100 раз быстрее чем чел с 10000 оных. 3. Писать алгоритм разбики дебиторов на группы в зависимости от количества транзакции в периоде это тоже напряг и для писателя и для сервера потом его исполнять. Короче не нравится мне это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2005, 15:41 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
тогда так: процедура в цикле берёт из очереди нерассчитанные счета (по одному или пачками). и опять делаете джобов по кл-ву процессоров гарантируется равномерная нагрузка на процессоры и никаких разбивающих алгоритмов не надо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2005, 16:39 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
т.е. в таблицу заливаем список всех подлежащих рассчету дебиторов и натравливаем на нее "свору бобиков" по числу процессоров. хорошая идея, однако. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2005, 18:05 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
backfireт.е. в таблицу заливаем список всех подлежащих рассчету дебиторов и натравливаем на нее "свору бобиков" по числу процессоров. хорошая идея, однако.ну можно не в таблицу заливать, а в существующую таблицу поле добавить но этих "бобиков" нужно будет синхронизировать чтобы они не лочили другу друга и одного и того же дебитора два раза не расчитывали. поможет в этом деле sp_getapplock ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2005, 19:12 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
А что, на чистом SQL нельзя что ли обработку написать? Всё будет распараллеливаться сервером. Да, и данных не так уж много у Вас. Хранимки по определению трудно эффективно распараллелить. Куда проще чистый SQL. С уважением, Константин Лисянский http://lissianski.narod.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2005, 00:10 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
Константин ЛисянскийА что, на чистом SQL нельзя что ли обработку написать? Всё будет распараллеливаться сервером. Да, и данных не так уж много у Вас. Хранимки по определению трудно эффективно распараллелить. Куда проще чистый SQL. С уважением, Константин Лисянский http://lissianski.narod.ru В смысле на чистом SQL? На на ANSI без курсоров? Думаю что не получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2005, 01:04 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
Именно без курсоров. А почему не получится? SQL - очень мощный язык. Можете для примера алгоритм описать, где Вы считаете, что SQL не поможет? С уважением, Константин Лисянский http://lissianski.narod.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2005, 10:56 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
Константин ЛисянскийИменно без курсоров. А почему не получится? SQL - очень мощный язык. Можете для примера алгоритм описать, где Вы считаете, что SQL не поможет? С уважением, Константин Лисянский http://lissianski.narod.ru в упрощенном виде. Задача 1. (простая) проводка(дебитор, счет, дата, видоперации, сумма, сальдо_после_операции) вид операции -приход -расход -начальное сальдо для "прихода" и "расхода" задана сумма для "начальное сальдо" задана сальдо_после_операции задание: заполнить "пустые клетки" Задача 2. (со звездочкой) проводка(товар, склад, дата, видоперации, количество, цена, стоимость, остаток, стоимость остатка, цена остатка) вид операции -приход -расход -инвентаризация количество известно для "прихода" и "расхода", остаток, цена остатка, стоимость остатка известно для "инвентаризации" цена известна для "расхода". задание: заполнить "пустые клетки" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2005, 19:05 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
backfireзадание: заполнить "пустые клетки" Можно с этого места немного поподробнее? Какие пустые клетки и чем заполнять? Небольшой пример приведите, пожалуйста. Спасибо. С уважением, Константин Лисянский http://lissianski.narod.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2005, 23:04 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
Константин Лисянский backfireзадание: заполнить "пустые клетки" Можно с этого места немного поподробнее? Какие пустые клетки и чем заполнять? Небольшой пример приведите, пожалуйста. Спасибо. С уважением, Константин Лисянский http://lissianski.narod.ruчто непонятного? для операций приход-расход надо посчитать сальдо после операции для операции начальное сальдо надо посчитать сумму (хотя тут уже я не понял: чему равна эта сумма?) 2backfire: решал такую задачу, все расчёты были повешены на событие проведение документа. со всеми вытекающими плюсами и минусами... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2005, 23:48 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
Я так понял, что пустые клетки нужно заполнять только операций прихода и расхода. Не очень понятно, чем заполнять поле сумма для операции сальдо. С уважением, Константин Лисянский http://lissianski.narod.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2005, 00:07 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
В общем, если я понял задачу правильно, то решат буду примерно так: Создаём таблицу: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Наполняем: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. Смотрим, что получилось: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Заполняем пустые ячейки: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Убеждаемся в том, что работает параллельно: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. AMP - это единица параллелизма (отдельный процесс, работающий со своим кусочком таблицы). All AMPs означает, что шаг запроса выполняется всеми единицами параллелизма. Видно, что третий шаг запроса (собственно, вычисление) выполняется параллельно. Что и требовалось доказать. По тому же принципу можно решить и вторую задачу. С уважением, Константин Лисянский http://lissianski.narod.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2005, 00:55 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
Спасибо, Константин. Ты догадлив, только одно но. Начальное сальдо не всегда одно а их может быть несколько в истории (дебитора, счета). И не всегда начальное сальдо является первым в истории. Могут быть проводки и до него. То же самое справедливо и для первой задачи. Что за супер SQL ты используешь? От кого это? ANSI до этого далеко не дотягивает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2005, 11:36 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
Если задачу сформулировать в полном объёме, то можно подумать, как её решить. Эта задача была очень простая и SQL, как видишь, несложный, и времени его написание заняло пять минут. Использую СУБД Teradata. Приведённый мной SQL полностью ANSI-1999 совместиый (кроме CREATE TABLE, который имеет особенность, в частности понятие PRIMARY INDEX специфично для Терадаты). Рекомендую почитать спецификацию на ANSI SQL. Найдёшь много интересного. Попробуй на SQL Server. Должно сработать. С уважением, Константин Лисянский http://lissianski.narod.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2005, 11:58 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
Константин ЛисянскийЕсли задачу сформулировать в полном объёме, то можно подумать, как её решить. Считай, что мой предыдущий комментарий это уже и есть полный объем. Если что надо дополнить - давай в Асю. Константин Лисянский Эта задача была очень простая и SQL, как видишь, несложный, и времени его написание заняло пять минут. Использую СУБД Teradata. Приведённый мной SQL полностью ANSI-1999 совместиый (кроме CREATE TABLE, который имеет особенность, в частности понятие PRIMARY INDEX специфично для Терадаты). С "CREATE TABLE" это прикол? Константин Лисянский Рекомендую почитать спецификацию на ANSI SQL. Найдёшь много интересного. Попробуй на SQL Server. Должно сработать. Пилотаж типа OVER (PARTITION BY ... CURRENT ROW) доступен только с Юкона, а в Шилоне - "фиг вам" - индейская хижина. Оно конечно приятно осваивать новую технику, но если в C# компилятор "приятным женским голосом сообщает", что функция XYZ deprecated и надо юзать функцию zyx, то в T-SQL на курсорах производительность просто просаживатся до нехочу (в 3-4 раза) а дальше думайте сами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2005, 12:17 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
backfireНачальное сальдо не всегда одно а их может быть несколько в истории (дебитора, счета). И не всегда начальное сальдо является первым в истории. Могут быть проводки и до него. В последнем нет ничего страшного - можно ту же операцию и назад распространить и посчитать сальдо от известного назад по операциям. Только не складывать придётся, а вычитать. Кстати, по поводу ансишности вышеприведённого SQL - есть статейка Ричарда Винтерса: SQL-99’s New OLAP Functions backfireСчитай, что мой предыдущий комментарий это уже и есть полный объем. Если что надо дополнить - давай в Асю. В Асе я только поздно вечером бываю около 22:00. Если устраивает, то мыль свою асю под ник. backfireС "CREATE TABLE" это прикол? Почему прикол? Правду написал. PRIMARY INDEX только в Терадате есть. backfireПилотаж типа OVER (PARTITION BY ... CURRENT ROW) доступен только с Юкона, а в Шилоне - "фиг вам" - индейская хижина. Сорри, я не подумал. SQL Server в 2000 вышел. А SQL-99 тоже где-то в это время. Не смогли бы они реализовать это всё. Ну, значит, надо тебе на Юкон переходить. Правда, сомневаюсь в том, что он может эффективно распараллеливать операции, тем более оконные. backfireОно конечно приятно осваивать новую технику, но если в C# компилятор "приятным женским голосом сообщает", что функция XYZ deprecated и надо юзать функцию zyx, то в T-SQL на курсорах производительность просто просаживатся до нехочу (в 3-4 раза) а дальше думайте сами. Поэтому я всегда избегал курсоров. Они не параллелятся. А если работаешь с большими объёмами данных, то это очень не хорошо. Кстати, раз уж зашло о вычислениях на этапе ETL. В Терадате есть такая фиговина, называется Teradata Analytical Calculator (TAC). Это движок параллельных вычислений, как раз предназначеный для проведения массовых параллельных вычислений на больших объёмах данных. Не сочтите за рекламу, просто хочется нести знание в массы :) По поводу ETL и параллелизма. На мой взгляд, инструменты типа DataStage скоро начнут сдавать позиции, поскольку СУБД уже набрали достаточную мощь для того, чтобы с помощью SQL решать задачи ETL. В подтверждение тому появление такого ETL тулза, как Sunopsis, который делает ETL с помощью генерации SQL. Для него не требуется выделенный сервер ETL (экономия на платформе) и он использует параллельный движок СУБД (хорошая утилизация плоатформы СУБД, производтиельность и масштабируемость). Кстати, на мой взгляд, и с OLAP скоро то же самое будет происходить, реляционные СУБД будут иметь функциональность OLAP прямо в движке СУБД и в SQL (те же оконые функции и т.д). С уважением, Константин Лисянский http://lissianski.narod.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2005, 14:28 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
В Асе я только поздно вечером бываю около 22:00. Если устраивает, то мыль свою асю под ник. Отмылил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2005, 14:57 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
backfireЧто за супер SQL ты используешь? Немного добавлю исчерпывающий ответ Константина Лисянского ... Аналитические функции используемые в вышеприведенном запросе реализованны, также и в БД Oracle. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2005, 17:28 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
Думаю, что и в DB/2 тоже уже реализованы. С уважением, Константин Лисянский http://lissianski.narod.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2005, 18:17 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
Константин ЛисянскийДумаю, что и в DB/2 тоже уже реализованы. С уважением, Константин Лисянский http://lissianski.narod.ru Вот такой я дремучий, сижу на допотопном SQL2000. Конечно великое переселение на Юкон началось, но это дело не одной ночи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2005, 19:08 |
|
||
|
SSIS. Паралельная обработка (a la Producer Consumer Queue)
|
|||
|---|---|---|---|
|
#18+
боюсь что не поможет: Юкон не поддерживает aggregation group, то есть кусок "ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW" в данном примере :( http://msdn2.microsoft.com/en-us/library/ms189461.aspx ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2005, 11:15 |
|
||
|
|

start [/forum/topic.php?fid=49&msg=33425751&tid=1870227]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 213ms |
| total: | 377ms |

| 0 / 0 |
