SSRS 报告在 10 分钟后超时
SSRS Report timing out after 10 minutes
我有一份报告,其中包含非常慢的数据集。不幸的是,我们目前无法进一步优化查询。但是,无论我更改什么超时,报告仍然会在 10 分钟后超时。我已经尝试过报告数据集超时、报告执行超时以及 sql 服务器上的远程执行。 None 似乎有效。
一些挖掘产生了以下资源,我也尝试过但无济于事:
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)
将需要过滤媒体,但如果它可以 return 在合理的时间内全部完成,那么应该没问题(如果该逻辑错误,请纠正我。我对 sql 很陌生)。
这不是直接的答案,而是解决方法。您可以在处理选项中打开缓存。然后安排一个订阅来刷新缓存。 运行 的预定报告超时要宽松得多。然后,当您查看报告时,您甚至不必等待 10 分钟,它会直接从缓存中加载。
解决方法,尝试减少报告中不必要的列
“...我们有一个连接到服务器并从那里运行报告的报告查看器应用程序”
所以你有一些东西。
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 以外的所有人的超时值。您的应用程序会超时吗?
我能够将查询重写为以下内容。它大大提高了速度(从约 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 <> 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
) 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] > 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)
我有一份报告,其中包含非常慢的数据集。不幸的是,我们目前无法进一步优化查询。但是,无论我更改什么超时,报告仍然会在 10 分钟后超时。我已经尝试过报告数据集超时、报告执行超时以及 sql 服务器上的远程执行。 None 似乎有效。
一些挖掘产生了以下资源,我也尝试过但无济于事:
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)
将需要过滤媒体,但如果它可以 return 在合理的时间内全部完成,那么应该没问题(如果该逻辑错误,请纠正我。我对 sql 很陌生)。
这不是直接的答案,而是解决方法。您可以在处理选项中打开缓存。然后安排一个订阅来刷新缓存。 运行 的预定报告超时要宽松得多。然后,当您查看报告时,您甚至不必等待 10 分钟,它会直接从缓存中加载。
解决方法,尝试减少报告中不必要的列
“...我们有一个连接到服务器并从那里运行报告的报告查看器应用程序”
所以你有一些东西。
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 以外的所有人的超时值。您的应用程序会超时吗?
我能够将查询重写为以下内容。它大大提高了速度(从约 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 <> 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
) 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] > 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)