Устранение неполадок отчета SSRS 2005, который работает медленно - PullRequest
0 голосов
/ 16 сентября 2010

У меня есть отчет в SSRS 2005 со встроенным запросом SQL (без хранимой процедуры). Этот отчет выполняется медленнее в SSRS, чем запрос будет выполняться в SSMS. Мне интересно, как это устранить, и есть ли различия в способах оптимизации запросов для отчета со встроенным кодом SQL и хранимой процедурой.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 сентября 2010

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

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

select
       reverse ( substring ( reverse ( el . ReportPath ), 1 , charindex ( '/' , reverse ( el . ReportPath ))- 1 )) as ReportName
       , u . UserName as LastModBy
       , coalesce ( cast ( el . parameters as varchar ( max )), '' ) as [Parameters]
       ,( select count (*) from executionlog2 tmp where tmp . reportpath = el . reportpath and tmp . username = el . username and tmp . reportaction = 'Render' and tmp . status = 'rsSuccess' group by tmp . ReportPath ) as UserCount60Day
       , el . Format
       , el . UserName
       , el . ReportAction
       , el . Status
       , el .Source
       , el . [RowCount]
       , el . ExecutionId
       , el . TimeDataRetrieval / 1000 as DataRetrieval
       , el . TimeProcessing / 1000 as Processing
       , el . TimeRendering / 1000 as Rendering
       ,( el . TimeProcessing + el . TimeRendering ) / 1000 as ProcessAndRender
       , el . AdditionalInfo
       , case
             when datediff ( ss , el . TimeStart , el . TimeEnd ) >= 30
                   then 1
             else 2
       end as DisplayInRed

from
      ExecutionLog2 el
       join ReportServer . dbo . Catalog c  
             on c . Path = el . ReportPath
       join ReportServer . dbo . Users u  
             on u . UserId = c . ModifiedByID

where
      el . ReportAction = 'Render'

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

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

0 голосов
/ 16 сентября 2010

Могут быть различия между выполнением запроса из SSMS и отчетом, но оптимизация запросов SQL Server - не это.Другими словами, SQL Server не волнует, откуда поступил запрос.

Во-первых, вы должны использовать SQL Profiler для захвата запроса при запуске из обоих источников.Вы можете увидеть, вызвана ли реальная разница в производительности временем на SQL Server, а не в другом месте.Кроме того, с результатами вы можете увидеть, идентичны ли запросы.SSRS, вероятно, использует параметризованный запрос, и он на самом деле отличается от того, что вы используете в SSMS.

Большой ли объем данных возвращается в отчет?Вы можете увидеть разницу во времени, потому что результаты быстрее возвращаются в SSMS.

...