【问题标题】:SSRS Report timing out after 10 minutesSSRS 报告在 10 分钟后超时
【发布时间】:2017-02-08 16:30:32
【问题描述】:

我有一份报告,其中的数据集非常慢。不幸的是,我们目前无法进一步优化查询。但是,无论我更改什么超时,报告仍然会在 10 分钟后超时。我已经尝试过报表数据集超时、报表执行超时以及在 sql server 上的远程执行。似乎都没有奏效。

一点挖掘产生了以下资源,我也尝试过无济于事:

https://blogs.msdn.microsoft.com/selvar/2010/07/12/report-builder-2-0-3-0-errors-out-with-the-operation-has-timed-out-when-previewing-a-report-saved-in-report-server-takes-more-than-10-minutes/

https://msdn.microsoft.com/en-us/library/ms155782.aspx

为什么我的报告会在 10 分钟后超时?

脚本:

DECLARE @SessionDateFrom DATETIME = '2016/11/01'
DECLARE @SessionDateTo DATETIME = '2016/12/01'
DECLARE @SiteNo INT = 1

SELECT DISTINCT [CS].[No] AS SiteNo
    ,[CS].[Name] AS SiteName
    ,TSE.[MediaNo] AS Media
    ,TSE.[MediaIndex]
    ,Sum(TSE.[Qty]) AS SalesQty
    ,Sum(TSE.[Value]) AS SalesValue
    ,TSE.[MediaGroup]
    ,TSE.[MediaName]
    ,TSE.SortOrder
    ,TSE.[ReasonNo]
    ,[R].[Name] AS ReasonName
    ,Convert(BIT, CASE 
            WHEN TSE.[MediaNo] NOT IN (
                    1001
                    ,1002
                    ,1003
                    ,1004
                    ,3002
                    ,3004
                    ,7002
                    ,7004
                    ,7006
                    )
                THEN 1
            ELSE 0
            END) AS Clickable
FROM TSE
LEFT JOIN CS ON CS.No = TSE.SiteNo
LEFT JOIN R ON (R.No = TSE.ReasonNo)
WHERE EXISTS (
            SELECT Descendant
            FROM DescendantSites
            WHERE Parent = @SiteNo
                AND Descendant = TSE.SiteNo
            )
        AND (
            Qty <> 0
            OR Value <> 0
            )
        AND MediaNo <> 0
        AND ExcludeFromReport <> 1
        --AND (
        --  MediaNo IN (@MediaNo)
        --  OR MediaNo IS NULL
        --  )
        AND TermNo = 0
        AND SessionDate BETWEEN @SessionDateFrom
            AND @SessionDateTo
GROUP BY [CS].[No]
    ,[CS].[Name]
    ,TSE.[MediaNo]
    ,TSE.[MediaIndex]
    ,TSE.[MediaGroup]
    ,TSE.[MediaName]
    ,TSE.SortOrder
    ,TSE.[ReasonNo]
    ,[Reason].[Name]
ORDER BY TSE.[MediaGroup]
    ,TSE.[SortOrder]
    ,TSE.[MediaIndex]
OPTION (OPTIMIZE FOR UNKNOWN)

需要过滤媒体,但如果它可以在合理的时间内全部返回,那么应该没问题(如果逻辑错误,请纠正我。我对 sql 很陌生)。

【问题讨论】:

  • “我们目前无法进一步优化查询”不知何故我怀疑这一点......
  • 您是在另一个网络应用程序中调用报告还是使用 ssrs 管理器?
  • @NinjaArekku 这不是一个有效的 SQL 脚本...CfgSites 表完全丢失。作为一种良好做法,您还应该在所有列引用上使用适当的表别名。比如MediaNo来自哪个表?
  • @NinjaArekku 也就是说,你有一个distinctgroup bys 表明你担心重复?这表明您没有正确地将表连接在一起。
  • @NinjaArekku 能否请您添加表行号、查询输出中的行数、此查询需要多长时间单独运行以及报告正在做什么的详细信息?

标签: sql-server reporting-services ssrs-2008


【解决方案1】:

我能够将查询重写为以下内容。它的速度大幅提升(从约 40 秒到约 2 秒)

SELECT [CfgSites].[No] AS SiteNo
,[CfgSites].[Name] AS SiteName
,[Media] AS Media
,[MediaIndex]
,Sum([Qty]) AS SalesQty
,Sum([Value]) AS SalesValue
,[MediaGroup]
,[MediaName]
,TSE.SortOrder
,TSE.[ReasonNo]
,[Reason].[Name] AS ReasonName
,Convert(BIT, CASE 
        WHEN TSE.[Media] NOT IN (
                1001
                ,1002
                ,1003
                ,1004
                ,3002
                ,3004
                ,7002
                ,7004
                ,7006
                )
            THEN 1
        ELSE 0
        END) AS Clickable
FROM (
SELECT SessionDate
    ,TransactionSales.SiteNo
    ,Media
    ,MediaIndex
    ,Qty
    ,Value
    ,MediaGroup
    ,FullName as MediaName
    ,SortOrder
    ,ReasonNo
FROM TransactionSales
LEFT JOIN MediaExtended ON TransactionSales.Media = MediaExtended.MediaNo 
AND TransactionSales.MediaIndex = MediaExtended.[Index]
INNER JOIN [Sessions] ON TransactionSales.[SiteNo] = [Sessions].[SiteNo] AND TransactionSales.[TermNo] = [Sessions].[TermNo] AND TransactionSales.SessionNo = [Sessions].[SessionNo] AND 
                     [Sessions].[Type] = 0
WHERE TransactionSales.SiteNo IN (@SiteNo)
    AND (
        Qty &lt;&gt; 0
        OR Value &lt;&gt; 0
        )
    AND Media &lt;&gt; 0
    AND ExcludeFromReport &lt;&gt; 1
    AND (
        MediaNo IN (@MediaNo)
        OR MediaNo IS NULL
        )
    AND TransactionSales.TermNo = 0
    AND SessionDate BETWEEN @SessionDateFrom
        AND @SessionDateTo
) TSE
LEFT JOIN CfgSites ON CfgSites.No = TSE.SiteNo
LEFT JOIN [Reason] ON ([Reason].[ReasonNo] = TSE.[ReasonNo])
GROUP BY [CfgSites].[No]
,[CfgSites].[Name]
,[Media]
,[MediaIndex]
,[MediaGroup]
,[MediaName]
,TSE.SortOrder
,TSE.[ReasonNo]
,[Reason].[Name]
UNION ALL

SELECT CfgSites.No
,CfgSites.Name
,MediaExtended.MediaNo
,0
,sum(transactionsales.qty) AS Qty
,SUM(transactionsales.value) AS Value
,MediaGroup
,ISNULL([MediaExtended].[FullName], 'Unknown Media') AS MediaName
,MediaExtended.SortOrder
,null
,null
,null
FROM MediaExtended
INNER JOIN transactionsales ON transactionsales.media = MediaExtended.TotalForMedia
INNER JOIN [Sessions] ON [TransactionSales].[SiteNo] = [Sessions].[SiteNo]
AND [TransactionSales].[TermNo] = [Sessions].[TermNo]
AND [TransactionSales].[SessionNo] = [Sessions].[SessionNo]
AND [Sessions].[Type] = 0
LEFT JOIN CfgSites ON TransactionSales.SiteNo = CfgSites.No
WHERE [MediaExtended].[TotalForMedia] &gt; 0    AND TransactionSales.SiteNo IN (@SiteNo)
    AND (
        Qty <> 0
        OR Value <> 0
        )
    AND Media <> 0
    AND ExcludeFromReport <> 1
    AND (
        MediaNo IN (@MediaNo)
        OR MediaNo IS NULL
        )
    AND TransactionSales.TermNo = 0
    AND SessionDate BETWEEN @SessionDateFrom
        AND @SessionDateTo

        Group By CfgSites.No
,CfgSites.Name
,MediaNo
,MediaGroup
,FullName
,MediaExtended.SortOrder

ORDER BY [MediaGroup]
,TSE.[SortOrder]
,[MediaIndex]
OPTION (OPTIMIZE FOR UNKNOWN)

【讨论】:

  • 你也可以修改为join吧?存在(从 DescendantSites WHERE Parent = @SiteNo AND Descendant = TSE.SiteNo 选择后代)
  • 这有点晚了,但你能解释一下你做了什么以及为什么要让查询变得这么快吗?
  • @DanielKotin 我已经更新了我的脚本以反映这些更改。一定是忘记这样做了。道歉。
【解决方案2】:

这不是直接的答案,而是一种解决方法。您可以在处理选项中打开缓存。然后安排订阅以刷新缓存。运行计划报告的超时时间要宽松得多。然后,当您查看报告时,您甚至不必等待 10 分钟,它就会从缓存中加载。

【讨论】:

    【解决方案3】:

    解决方法,尽量减少报告中不必要的列

    【讨论】:

    • 报告目前只使用它需要的列。
    【解决方案4】:

    “...我们有一个报告查看器应用程序连接到服务器并从那里运行报告”

    所以你有一些东西。

    1. SSRS API Connection Timeout (http)
    2. SSRS Database connection timeout (Dataset)
    3. SSRS Report Processing Timeout (Report)
    4. Your Report Viewer application timeout (http)
    

    您已声明已增加除了 #4 之外的所有超时值。您的应用程序会超时吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多