Thiago Zavaschi R2 www.zavaschi.com

12Apr/124

Análise de Performance no Reporting Services (SSRS)

Olá pessoal,

O servidor de relatórios contido na suíte do SQL Server é muito usado e há uma série de características sobre ele que não usamos ou que desconhecemos que existe.

Hoje vou comentar sobre um dos pontos iniciais a se olhar quando são identificados problemas relacionados a performance no SSRS e indicar um direcionamento para a análise.

O primeiro ponto que podemos olhar é o Execution Log que nos provê dados relacionados às execuções de relatórios no servidor.

Há uma view que mapeia algumas tabelas (que podem ser usadas também, como a ExecutionLogStorage/ExecutionLog) chamada ExecutionLog2 e é encontrada na base de dados principal do Reporting Services (o nome padrão é ReportServer).

Esta view nos traz dados importantes e também já utiliza o hint NOLOCK para minimizar o impacto da sua execução. Entre eles podemos citar:

ReportPath: O caminho do relatório.

TimeStart: Horário de início do processamento. Um jeito interessante de fazer select na view ExecutionLog2 é ordenar por esta coluna.

TimeEnd: Horário de término do processamento. Relatórios que apresentam problemas de não completarem e que a diferença entre TimeEnd e TimeStart seja constante, podem indicar um problema de timeout das execuções.

TimeDataRetrieval: É o tempo que demora para o relatório obter os dados da fonte de dados (seja ela SSAS, SQL Server, Oracle, e assim por diante). Se é encontrado problema de performance neste ponto o indicado é verificar a otimização da query usada para o consumo dos dados e/ou verificar a fonte de dados se está corretamente implementada (índices, estatísticas, etc).

TimeProcessing: O tempo das operações que os relatórios utilizam como ordenação, agregação e filtro é contabilizado aqui (subrelatórios também são contabilizados nesta coluna). Para melhorar deve-se investigar se o relatório está fazendo as operações devidas. Uma boa prática é já passar ao relatório os dados na granularidade que irá precisar ao invés dos dados crus. Uma vez que, em geral, a agregação na fonte poderá ter um melhor desempenho.

TimeRendering: é o tempo que leva para tranformar do formato intermedíario para o formato renderizado. Os formatos mais custosos são Excel (é o mais), PDF, Word e TIFF.

A definição da View é a seguinte:

CREATE VIEW [dbo].[ExecutionLog2]
AS
SELECT
    InstanceName,
    COALESCE(C.Path, 'Unknown') AS ReportPath,
    UserName,
    ExecutionId,
    CASE(RequestType)
        WHEN 0 THEN 'Interactive'
        WHEN 1 THEN 'Subscription'
        ELSE 'Unknown'
        END AS RequestType,
    -- SubscriptionId,
    Format,
    Parameters,
    CASE(ReportAction)       
        WHEN 1 THEN 'Render'
        WHEN 2 THEN 'BookmarkNavigation'
        WHEN 3 THEN 'DocumentMapNavigation'
        WHEN 4 THEN 'DrillThrough'
        WHEN 5 THEN 'FindString'
        WHEN 6 THEN 'GetDocumentMap'
        WHEN 7 THEN 'Toggle'
        WHEN 8 THEN 'Sort'
        ELSE 'Unknown'
        END AS ReportAction,
    TimeStart,
    TimeEnd,
    TimeDataRetrieval,
    TimeProcessing,
    TimeRendering,
    CASE(Source)
        WHEN 1 THEN 'Live'
        WHEN 2 THEN 'Cache'
        WHEN 3 THEN 'Snapshot'
        WHEN 4 THEN 'History'
        WHEN 5 THEN 'AdHoc'
        WHEN 6 THEN 'Session'
        WHEN 7 THEN 'Rdce'
        ELSE 'Unknown'
        END AS Source,
    Status,
    ByteCount,
    [RowCount],
    AdditionalInfo
FROM ExecutionLogStorage EL WITH(NOLOCK)
LEFT OUTER JOIN Catalog C WITH(NOLOCK) ON (EL.ReportID = C.ItemID)

Bom pessoal, era isso que eu queria mostrar hoje. Espero que seja um ponto de partida para avaliar o que pode estar causando gargalos na geração dos seus relatórios.

Edit:

Bom para complementar segue um exemplo extraído aqui da saída da execução da view:

SELECT * FROM ExecutionLog2

InstanceName: SQL2008R2-SSRS\MSSQLSERVER                                ReportPath: /AdventureWorks 2008R2/AdventureWorks2008R2_Base
UserName: DENALI\Administrator  
ExecutionId: oxwvm3vl3n0mnyqlextnkujf                                        
RequestType: Interactive
Format: RPL
Parameters: ShowAll=False
ReportAction: Render
TimeStart: 2012-04-13 11:25:38.997
TimeEnd: 2012-04-13 11:25:40.560
TimeDataRetrieval: 0
TimeProcessing: 348
TimeRendering: 878
Source: Live  
Status: rsSucess
ByteCount: 1913           
RowCount: 0            
AdditionalInfo: <AdditionalInfo><ProcessingEngine>2</ProcessingEngine><ScalabilityTime>
<Pagination>0</Pagination><Processing>0</Processing></ScalabilityTime>
<EstimatedMemoryUsageKB><Pagination>0</Pagination><Processing>0</Processing>
</EstimatedMemoryUsageKB></AdditionalInfo>

E segue também a sugestão do Ildo (feita nos comentários) sobre utilização da view, valeu!

SELECT
[UserName]
,[ReportPath]
,COUNT([ReportPath]) as Executions
,( SELECT MAX(TimeStart) FROM [ReportServer].[dbo].[ExecutionLog2] as clog WHERE clog.UserName = olog.UserName AND clog.ReportPath = olog.ReportPath ) LastExecution
FROM [ReportServer].[dbo].[ExecutionLog2] as olog
WHERE [UserName] NOT IN ( ‘ildo’, ‘TKD-DB\sd’ )
GROUP BY [UserName], [ReportPath]
ORDER BY [UserName], [ReportPath]

[]s!

Comments (4) Trackbacks (0)
  1. Animal brother! Tu podia colocar uma samples do resultset para vermos que tipo de informação / detalhamento / relevância conseguimos visualizar. AWESOME!
    Abssss

  2. Opa, claro guri!
    Vou colocar umas a mais tb, inclusive sobre o integrated mode com o SharePoint.
    []s!!

  3. Vai a dica:

    SELECT
    [UserName]
    ,[ReportPath]
    ,COUNT([ReportPath]) as Executions
    ,( SELECT MAX(TimeStart) FROM [ReportServer].[dbo].[ExecutionLog2] as clog WHERE clog.UserName = olog.UserName AND clog.ReportPath = olog.ReportPath ) LastExecution
    FROM [ReportServer].[dbo].[ExecutionLog2] as olog
    WHERE [UserName] NOT IN ( ‘ildo’, ‘TKD-DB\sd’ )
    GROUP BY [UserName], [ReportPath]
    ORDER BY [UserName], [ReportPath]

  4. Sou especialista e ensino tudo o que você precisa para começar sua profissão de Massagista e ter
    um bom faturamento mensal. Tenha autonomia na profissão que mais cresce no país com
    o Curso de Massagem online – Saúde Integral. São mais de 20 anos de experiência na área.

    Acesse http://www.cursodemassagem.com.br


Leave a comment


No trackbacks yet.