К сожалению это не будет комментарий, но это еще не вариант пока.
Сколько записей вы возвращаете? Вы просмотрели таблицу выполнения сервера отчетов, чтобы увидеть время, которое требуется для восстановления данных и рендеринга?
Если в отчете имеется большое количество возвращенных страниц, это потоковое сообщение, то есть .. 1 из 2? или он возвращает все страницы перед тем, как сделать первый?
Разве отчет занимает такое количество времени каждый раз, когда вы его вызываете, или это только в первый раз, в основном, когда план кэшируется, он работает быстро? Могут быть проблемы с компрессией.
EDIT: Запустите этот скрипт с вашей БД сервера отчетов. Это даст вам больше информации, чем вы искали, но, если вы заказываете по имени отчета, вы можете просматривать время поиска данных, время обработки или время обработки и рендеринга. Это скажет вам, где время фактически выполняется. Также ваш сервер отчетов будет сохранять последние 60 дней по умолчанию, поэтому, если ваш единственный желающий сказать вчера, то раскомментируйте дату между предложением where.
declare
@ReportPath varchar(200)
,@DayCount int
set @ReportPath = 'ALL'
set @DayCount = -1 * @DayCount
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]
,round(datediff(ss,el.TimeStart, el.TimeEnd)/60,0,1) DurationMin
,case
when datediff(ss,el.TimeStart, el.TimeEnd) > 59
then datediff(ss,el.TimeStart, el.TimeEnd) % 60
else datediff(ss,el.TimeStart, el.TimeEnd)
end as DurationSec
,case
when dt_el2.AvgDuration60Day > 59
then cast(round(dt_el2.AvgDuration60Day/60,0,1) as varchar(20)) + ' min ' + cast((dt_el2.avgduration60day % 60) as varchar(20)) + ' sec'
else cast(dt_el2.AvgDuration60Day as varchar(20)) + ' sec'
end as AvgDuration60Day
,case
when dt_el2.TotalDuration60Day > 59
then cast(round(dt_el2.TotalDuration60Day/60,0,1) as varchar(20)) + ' min ' + cast((dt_el2.TotalDuration60Day % 60) as varchar(20)) + ' sec'
else cast(dt_el2.TotalDuration60Day as varchar(20)) + ' sec'
end as TotalDuration60Day
,case
when dt_el2.MinDuration60Day > 59
then cast(round(dt_el2.MinDuration60Day/60,0,1) as varchar(20)) + ' min ' + cast((dt_el2.MinDuration60Day % 60) as varchar(20)) + ' sec'
else cast(dt_el2.MinDuration60Day as varchar(20)) + ' sec'
end as MinDuration60Day
,case
when dt_el2.MaxDuration60Day > 59
then cast(round(dt_el2.MaxDuration60Day/60,0,1) as varchar(20)) + ' min ' + cast((dt_el2.MaxDuration60Day % 60) as varchar(20)) + ' sec'
else cast(dt_el2.MaxDuration60Day as varchar(20)) + ' sec'
end as MaxDuration60Day
,dt_el2.Count60Day
,(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
join(
select
reportpath
,sum(datediff(ss,timestart,timeend)) as TotalDuration60Day
,max(datediff(ss,timestart,timeend)) as MaxDuration60Day
,min(datediff(ss,timestart,timeend)) as MinDuration60Day
,avg(datediff(ss,timestart,timeend)) as AvgDuration60Day
,count(*) as Count60Day
--,count(*) over(partition by username) as UserCount60Day
from
executionlog2
where
reportaction = 'Render'
and status = 'rsSuccess'
group by reportpath
) dt_el2 on el.ReportPath = dt_el2.ReportPath
where
(@reportpath = 'ALL' or el.ReportPath = @reportpath)
--and el.TimeStart between
--convert(varchar,dateadd(dd,@daycount,getdate()),112) + ' 00:00:00.000' and
--convert(varchar,getdate(),112) + ' 23:59:59.000'
and el.ReportPath != 'Unknown' -- exclude reports that have been deleted after executing
and el.ReportAction = 'Render'
order by durationmin desc, DurationSec desc;
Thats точки. Он возвращается, как десяток записей, и это один отчет о странице ... какие проблемы с компиляцией? компиляция того, что и как я могу узнать? –
Я пытаюсь выяснить, есть ли у вас проблема с рендерингом или если у вас проблема с производительностью sql. При выполнении запроса в ssms или при первом запуске отчета он выполнит компиляцию, чтобы найти лучший план запроса, а затем кешировать его.Если это очень сложный план запроса, для выполнения компиляции потребуется много времени, но после его кэша каждый раз, когда вы запустите его после этого, он будет быстрым, потому что вы пропустите компиляцию. Лучшее, что вы можете посмотреть, это таблица выполнения серверов отчетов. Я отредактирую свой ответ, чтобы дать вам запрос, чтобы узнать, извлечен ли его результат или рендер. – user404463