Tracking report usage

爷,独闯天下 提交于 2019-12-29 10:13:11

问题


Is there an easy way to track who is running a given report in SSRS 2005, and at what time they are running that report? We have about 80 reports in our SSRS implementation, and are trying to see if there's any that we can safely put out to pasture. If we could easily see somehow which reports aren't being used, that would help us. Any ideas?


回答1:


There is some good advice and queries for generating reports on this in the following article.

For example, if you want to see the most used reports, you can do the following:

SELECT COUNT(Name) AS ExecutionCount,
       Name,
       SUM(TimeDataRetrieval) AS TimeDataRetrievalSum,
       SUM(TimeProcessing) AS TimeProcessingSum,
       SUM(TimeRendering) AS TimeRenderingSum,
       SUM(ByteCount) AS ByteCountSum,
       SUM([RowCount]) AS RowCountSum
  FROM (SELECT TimeStart,
               Catalog.Type,
               Catalog.Name,
               TimeDataRetrieval,
               TimeProcessing,
               TimeRendering,
               ByteCount,
               [RowCount]
          FROM Catalog
               INNER JOIN 
               ExecutionLog
                 ON Catalog.ItemID = ExecutionLog.ReportID
         WHERE Type = 2
       ) AS RE
GROUP BY Name
ORDER BY COUNT(Name) DESC,
         Name;

One thing to note is that by default the execution log will only keep 2 months worth of data. You can control this behaviour with the ExecutionLogDaysKept server property, see this technet article.




回答2:


I know this question is so old it has whiskers, but the code below will list each report once with the last time it was run. I highly recommend you create a new folder called "obsolete reports" and move old reports there rather than delete them. That will remove the clutter but still keep them available in case the Accounting Department comes after you for that report they obviously need to run once every 3.26 years.

WITH RankedReports
AS
(SELECT ReportID,
        TimeStart,
        UserName, 
        RANK() OVER (PARTITION BY ReportID ORDER BY TimeStart DESC) AS iRank
   FROM dbo.ExecutionLog t1
        JOIN 
        dbo.Catalog t2
          ON t1.ReportID = t2.ItemID
)
SELECT t2.Name AS ReportName,
       t1.TimeStart,
       t1.UserName,
       t2.Path,
       t1.ReportID
  FROM RankedReports t1
       JOIN 
       dbo.Catalog t2
         ON t1.ReportID = t2.ItemID
 WHERE t1.iRank = 1
ORDER BY t1.TimeStart;



回答3:


i always found the report logs are a bit hard to use. Reporting services keeps a record of all its activity in a table in the reporting database called ExecutionLog

I have a couple of reports i use that query this table, so you can find out what reports are actually used, and who the heaviest users are




回答4:


You can monitor the report usage using execution logs. Please check this http://technet.microsoft.com/en-us/library/aa964131(SQL.90).aspx

You can also run a query to find report usage. Check Maz's reply in this link http://www.sqlservercentral.com/Forums/Topic433562-150-1.aspx

cheers




回答5:


This SQL will also give you the data source, user and the request type:

select row_number() over (order by LogEntryId) as Id,  LogEntryId, 
        r.Name AS Report_Name, r.Path AS Report_Path, c2.Name AS Data_Source, 
        replace(c2.ConnectString,';Unicode=True','') as ConnectString,
        SUBSTRING(r.Path, 2, LEN(r.Path) - LEN(r.Name) - 2) AS Folder_Path,
        ex.UserName, ex.Format, ex.TimeProcessing, ex.TimeRendering, ex.[RowCount],
        CAST (ex.TimeStart as date) AS TimeStart,
        DATEPART (hour, ex.TimeStart) AS StartHour,
        DATEPART (minute, ex.TimeStart) AS StartMinute,
        case  
            when ex.RequestType = 0 then 'Interactive'  
            when ex.RequestType = 1 then 'Subscription'  
            when ex.RequestType = 2 then 'Refresh Cache'  
        else 'Unknown' end RequestType,
        u.UserName as CreatedBy,
        ex.Status
    from ExecutionLogStorage ex (nolock) --exec log
        join Catalog (nolock) r on ex.ReportID = r.ItemID and r.Type = 2 --report
        join DataSource ds with (nolock) ON ds.ItemID = r.ItemID  --report to connection link
       join (select ItemID, Name, SUBSTRING(Content, CHARINDEX('<ConnectString>',Content) + 15, CHARINDEX('</ConnectString>',Content) - CHARINDEX('<ConnectString>',Content) - 15) AS ConnectString
                from  ( select ItemID, Name, CONVERT(NVARCHAR(MAX),CONVERT(XML,CONVERT(VARBINARY(MAX),Content))) As Content 
                        from Catalog with (nolock) where Type = 5) x
        ) c2  ON ds.Link = c2.ItemID -- connection
        left join Users u on u.UserID = r.CreatedByID



回答6:


USE ReportServer
SELECT c.Name AS ItemName
    ,  CASE c.Type
        WHEN 1 THEN 'Folder'
        WHEN 2 THEN 'Report'
        WHEN 3 THEN 'Resource'
        WHEN 4 THEN 'Linked Report'
        WHEN 5 THEN 'Data Source'
        ELSE CAST(c.Type AS VARCHAR(100))
        END AS ItemType
    ,  c.Path AS ItemPath
    ,  ( SELECT TOP 1 TimeStart FROM dbo.ExecutionLog t1 WHERE t1.ReportID = c.ItemID ORDER BY TimeStart DESC ) AS LastRunDate
    ,  ( SELECT TOP 1 UserName FROM dbo.ExecutionLog t1 WHERE t1.ReportID = c.ItemID ORDER BY TimeStart DESC ) AS LastUser
 FROM Catalog AS c WITH (NOLOCK)
 WHERE 1=1
    --AND c.Type IN (1,2)

--uncomment if searching for reports and folders only



来源:https://stackoverflow.com/questions/1179082/tracking-report-usage

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!