Как я могу запустить несколько отчетов SSRS в нескольких потоках

1

У меня около 100 связанных отчетов, которые запускаются еженедельно и ежемесячно. Я собрал консоль aС#, которая динамически создает папки сервера отчетов за определенный период из таблицы db и создает связанные отчеты SSRS из таблицы db. Эти отчеты работают нормально, но каждый отчет запускается по одному в цикле foreach, что прекрасно, если вы запускаете их в одночасье, но иногда эти отчеты терпят неудачу (по какой-либо причине), а неудачные отчеты помечены как таковые в БД.

Мой вопрос: как я могу запускать (например) 10 отчетов по потоку и запускать каждый поток в одно и то же время - 10 потоков одновременно, поэтому время для запуска всех отчетов должно быть намного быстрее. Это займет немного времени для повторного запуска любых неудачных отчетов в понедельник. Возможно ли это?

В моей консоли С# я использую ReportingService2010 для создания моих связанных отчетов:

ReportingService2010.CreateLinkedItem(linkedReport, folder, existingReportPath, props);

ReportingService2010.SetExecutionOptions(reportPath, "Snapshot", new NoSchedule());

ReportingService2010.SetItemHistoryOptions(reportPath, true, true, new NoSchedule());

ReportingService2010.UpdateItemExecutionSnapshot(reportPath);

Любая помощь могла бы быть полезна. Большое спасибо

  • 0
    Вы понимаете, что в SSRS есть функция, позволяющая планировать запуск отчетов? Кажется, нет веских причин для их запуска таким образом.
  • 0
    Можете ли вы динамически создавать папки сервера отчетов и создавать связанные отчеты по расписанию? Для каждой недели / месяца нам нужно создать структуру папок с новым периодом обработки, чтобы наши пользователи могли просматривать исторические данные в любой момент времени.
Показать ещё 2 комментария
Теги:
sql-server
multithreading
reporting-services

1 ответ

0

Прямое решение: создайте несколько консольных клиентов С#, которые разделяют все поколения отчетов (как если бы несколько клиентов одновременно обращались к доступным отчетам). Таким образом, вы точно знаете, что генерация отчета выполняется партиями. И это, потому что вы не можете заставить сервер SSRS обрабатывать определенное количество отчетов одновременно. Он будет обрабатывать свою рабочую нагрузку независимо от того, как вы запрашиваете генерацию отчета.

Тем не менее, я считаю, что это неправильный подход.

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

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

Во всяком случае, я понимаю, что создание DW - это большой проект, и вы ищете более легкое решение. Для этого вам нужно будет определить, где узкое место (sql engine, ssrs rendering,...) и попытаться сбалансировать или увеличить ваши ресурсы (если возможно), чтобы освободить это узкое место.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню