SSRS запускает отчет в течение 30 секунд, однако в SQL Studio это занимает всего 3 секунды - PullRequest
0 голосов
/ 29 августа 2010

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 20 июня 2012

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

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

Это уменьшило время, необходимое для подготовки отчета, до 3 секунд.

~ Rantscant

2 голосов
/ 02 сентября 2010

Извините, это не комментарий, но это еще не вариант.

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

Если в отчете содержится большое количество возвращенных страниц, то потоковое ли это сообщение, т. Е. 1 из 2? или он возвращает все страницы перед рендерингом первой?

Занимает ли отчет такое количество времени каждый раз, когда вы его называете, или это только первый раз, в основном, когда план кэшируется, он работает быстро? Могут быть проблемы компиляции.

РЕДАКТИРОВАТЬ: Запустите этот скрипт для базы данных вашего сервера отчетов. Он даст вам гораздо больше информации, чем вы искали, но, если вы упорядочите по имени отчета, вы сможете просмотреть время получения данных, время обработки или обработки и время рендеринга. Это скажет вам, где время фактически берется. Кроме того, ваш сервер отчетов будет сохранять последние 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 голосов
/ 02 сентября 2010

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

EXEC custom_sp_name_here

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

Джейми Ф

0 голосов
/ 31 августа 2010

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

...