我在SSRS 2005中使用嵌入式SQL查詢(無存儲過程)生成報告。此報告在SSRS中運行速度比查詢在SSMS中運行速度慢。我想知道如何解決這個問題,以及查詢優化在嵌入SQL代碼和存儲過程的報告中的工作方式有什麼不同。疑難解答運行緩慢的SSRS 2005報告
謝謝!
我在SSRS 2005中使用嵌入式SQL查詢(無存儲過程)生成報告。此報告在SSRS中運行速度比查詢在SSMS中運行速度慢。我想知道如何解決這個問題,以及查詢優化在嵌入SQL代碼和存儲過程的報告中的工作方式有什麼不同。疑難解答運行緩慢的SSRS 2005報告
謝謝!
從SSMS和報表運行查詢可能存在差異,但SQL Server查詢優化不是這樣。換句話說,SQL Server不關心查詢的來源。
首先,您應該使用SQL事件探查器從兩個源運行時捕獲查詢。您可以查看實際的性能差異是否由於SQL Server上的時間而導致,而不是其他地方。此外,結果可以看出查詢是否相同。 SSRS可能使用參數化查詢,它實際上與您在SSMS中運行的不同。
是否有大量的數據返回到報表?您可能會看到時間差異,因爲結果會更快返回到SSMS。
存儲過程和查詢通過ssrs都會得到參數化,所以它們應該以相同的方式被緩存,雖然它們將是2個不同的緩存。如果我是你,我將開始檢查報表服務器數據庫上的執行日誌,以查找問題來自哪裏。
這是一個腳本,它會告訴你它需要獲取數據,進程和渲染的時間。
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]
,(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
where
el . ReportAction = 'Render'
在執行報告時還要保持探查器運行,以便您可以看到幕後發生了什麼。
希望它有幫助。