WinForms ReportViewer: медленный начальный рендеринг - PullRequest
6 голосов
/ 10 января 2009

ОБНОВЛЕНИЕ 2.4.2010 Да, это старый вопрос, но я подумал, что дам обновление. Итак, я снова работаю с ReportViewer, и он все еще медленно рендерится при начальной загрузке. Разница лишь в том, что база данных SQL находится на сервере отчетов.


ОБНОВЛЕНИЕ 3.16.2009

Я выполнил профилирование, и не SQL-сервер медленно отображает ReportViewer при первом вызове. При первом вызове элемент управления ReportViewer блокирует поток пользовательского интерфейса и делает программу не отвечающей. Примерно через 5 секунд ReportViewer разблокирует поток пользовательского интерфейса и отобразит «Отчет создается», а затем, наконец, отобразит отчет. Я знаю, что 5 секунд - это немного, но этого не должно быть. Мой коллега делает то же самое в своей программе, и ReportViewer немедленно отображает «Отчет генерируется» по любому запросу.

Единственное отличие состоит в том, что сервер отчетов находится на одном сервере, а данные - на другом сервере. Однако, когда я разрабатываю отчеты в SSRS, задержка не возникает.


UPDATE

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


У меня есть WinForms ReportViewer, который я использую в Удаленном режиме обработки, который может занять до 30 секунд для рендеринга при вызове метода ReportViewer.RefreshReport (). Однако сам отчет работает быстро.

Это код для настройки моего ReportViewer:

rvReport.ProcessingMode = ProcessingMode.Remote
rvReport.ShowParameterPrompts = False
rvReport.ServerReport.ReportServerUrl = New Uri(_reportServerURL)
rvReport.ServerReport.ReportPath = _reportPath

Здесь ReportViewer может отображаться до 30 секунд:

rvReport.RefreshReport()

Ответы [ 11 ]

4 голосов
/ 29 апреля 2010

Я нашел ответ на других форумах. MSDN объясняет, что DLL ищет какой-то веб-сервер Verisign, и это занимает вечно ... Есть 2 способа отключить его, один - флажок в Internet Explorer, а другой - добавить несколько строк в приложение. .config файл приложения.

3 голосов
/ 17 марта 2009

В сумме различные идеи уже представлены, это может быть

  • время запуска инфраструктуры просмотра отчетов на клиенте
  • время загрузки кэша на клиенте
  • время выполнения запроса на сервере
  • время рендеринга отчета на сервере

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

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

Все вышеперечисленное интересно, но неважно. Если вы хотите обеспечить быстрый отклик на отчет, службы Reporting Services предоставляют расширенную поддержку для составления отчетов по расписанию, так что, когда потребитель запрашивает отчет, единственной задержкой является сетевая доставка.

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

3 голосов
/ 16 марта 2009

ReportServer всегда требуется время, чтобы проснуться, потому что он работает под IIS. На каждом AppPool есть тайм-аут процесса. У нас та же проблема с программой просмотра отчетов нашего приложения ASP.NET. Вы можете попробовать увеличить время поддержки AppPool в настройках IIS.

Смотрите здесь:

Я предполагаю, что вы используете SS200 SQL2005.

Одним из вариантов является обновление до 2008 года, когда SSRS больше не зависит от IIS.

2 голосов
/ 17 апреля 2010

У меня была такая же проблема.

Я обнаружил, что смена принтера по умолчанию (медленная сеть здесь) решает проблему.

ReportViewer получает некоторую информацию от принтера по умолчанию, и так как сеть здесь очень медленная, у меня было 10 секунд задержки

Надеюсь, это поможет

2 голосов
/ 17 января 2009

Мышление из коробки: находится ли сервер отчетов на другом компьютере, на котором запущено приложение? В сети может потребоваться много времени для разрешения «reportServerURL». После разрешения имя будет кэшировано, и, следовательно, последующие вызовы будут выполняться быстрее.

У меня раньше была эта проблема с плохо настроенными DNS-серверами. Попробуйте заменить «reportServerUrl» на «reportServerIPAddress» и посмотреть, быстрее ли начальный вызов ReportViewer.

2 голосов
/ 10 января 2009

Вы можете получить отчет в двух режимах, локальном и серверном. Если вы работаете в локальном режиме, он перенесет и данные, и определение отчета на ваш компьютер, а затем отобразит их оба. В режиме сервера он просто позволяет SSRS выполнять всю работу, а затем извлекает информацию для визуализации.

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

Кроме этого, не так много информации, чтобы продолжить ...

Обновление: так как вы заметили, что это только первый вызов, который занимает некоторое время, выполнили ли вы какое-либо профилирование, чтобы определить, выполняется ли основная часть работы над внутренними вызовами SQL или тратится на фактический отчет?

Если при последующих вызовах это происходит быстрее, возможно, вы (случайно) кешируете на том или ином уровне. Вы можете кэшировать отчеты (http://www.sqlservercurry.com/2007/12/configure-report-to-be-cached-ssrs-2005.html) или может быть, что план выполнения для возврата данных глубоко кэшируется в SQL Server.

1 голос
/ 17 марта 2009

Кажется, что вы идете сразу после отчета SSRS. Вы можете вместо этого использовать веб-сервис SSRS. Это может улучшить вашу производительность.

1 голос
/ 11 марта 2009

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

  • Разрешение DNS: URL-адрес должен быть преобразован в IP-адрес. Как только это сделано, он кэшируется локально, что ускоряет его.
  • ASP.NET / IIS нужно время, чтобы прогреться. Должны произойти все виды компиляции и начальной загрузки - после загрузки она будет оставаться в памяти сервера до тех пор, пока вы не перезапустите IIS или не произойдет время очистки по умолчанию.
  • Службам отчетов требуется время, чтобы прогреться так же, как ASP.NET/IIS.

Для проверки используйте сетевой монитор, такой как Netmon (если вы являетесь поклонником Microsoft) или Wireshark (моя рекомендация), и наблюдайте за трафиком с вашего компьютера на сервер. , Вы увидите запрос DNS, затем отправятся запросы HTTP, и задержка будет в возвращаемых данных. При втором вызове вы увидите, что скорость при возврате и проверке DNS значительно отличается.

То, что вы могли бы сделать, чтобы предотвратить это, - сценарий разминки - я не знаю его для SRS, но вот ссылка на SharePoint, которую не сложно изменить, так как он имеет точно такие же проблемы.

1 голос
/ 14 января 2009

UPDATE

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

0 голосов
/ 04 марта 2014

Насколько мне известно, я думаю, что это проблема, которую Microsoft решает с трудом.

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

Чтобы помочь противостоять этому, поместите форму запуска с меткой (Label1) и элементом управления Timer (Timer1). Set Label1.Text = "Пожалуйста, подождите (около 15 секунд)". Установите Timer1.Interval = 3. В событии form_Load формы запуска установите Timer1.Start. В событии Tick Timer1 поместите "frmMyReportForm.reportViewer1.SetDisplayMode (Microsoft.Reporting.WinForms.DisplayMode.Normal)"

"frmMyReportForm" - любая из форм в вашем проекте, содержащая элемент управления просмотра отчета.

Здесь будут учитываться все задержки, поэтому при создании фактического отчета задержек не будет.

Надеюсь, это может помочь моим коллегам-разработчикам.

...