2010-08-29 2 views
0

Отчет SSRS вызывает sproc из SQL 2008, и для его рендеринга требуется 30 секунд.SSRS запускает отчет за 30 секунд, однако в SQL Studio требуется всего 3 секунды

Если я вызываю тот же самый sproc с теми же параметрами, для завершения требуется 3 секунды.

SQL Server и SSRS находятся в одном окне.

Что я могу сделать?

ответ

2

К сожалению это не будет комментарий, но это еще не вариант пока.

Сколько записей вы возвращаете? Вы просмотрели таблицу выполнения сервера отчетов, чтобы увидеть время, которое требуется для восстановления данных и рендеринга?

Если в отчете имеется большое количество возвращенных страниц, это потоковое сообщение, то есть .. 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; 
+0

Thats точки. Он возвращается, как десяток записей, и это один отчет о странице ... какие проблемы с компиляцией? компиляция того, что и как я могу узнать? –

+0

Я пытаюсь выяснить, есть ли у вас проблема с рендерингом или если у вас проблема с производительностью sql. При выполнении запроса в ssms или при первом запуске отчета он выполнит компиляцию, чтобы найти лучший план запроса, а затем кешировать его.Если это очень сложный план запроса, для выполнения компиляции потребуется много времени, но после его кэша каждый раз, когда вы запустите его после этого, он будет быстрым, потому что вы пропустите компиляцию. Лучшее, что вы можете посмотреть, это таблица выполнения серверов отчетов. Я отредактирую свой ответ, чтобы дать вам запрос, чтобы узнать, извлечен ли его результат или рендер. – user404463

0

Вы в 2008 R2? Если это так, убедитесь, что вы применяете CU3, R2 был очень глючным.

+0

не только 2008 ... –

0

Я заметил разницу между использованием набора данных, который настроен на вызов хранимой процедуры в сравнении с набором данных, который настроен на использование текстового SQL-запроса, но весь текст это вызов того же SP.

EXEC custom_sp_name_here 

В том, что я видел, тестовый SQL-запрос, вызывающий SP, работает намного лучше, чем установка набора данных в хранимую процедуру.

Jamie F

+0

Я тоже использовать запрос вызова SP ... –

2

Недавно я испытал очень похожий вопрос с SQL запросом возвращающегося около 1000 строк данных относительно быстро (2 секунды) на SSMS, но сам отчет потребовалось несколько минут, чтобы сделать результаты.

Настройка свойства отчета «InteractiveSize» в SSRS заставила отчет разбивать возвращаемые данные, а не пытаться отобразить все на одной странице.

Это сократило время, затрачиваемое на то, чтобы сделать отчет до 3 секунд.

~ Rantscant

Смежные вопросы