2010-09-15 70 views
0

我在SSRS 2005中使用嵌入式SQL查詢(無存儲過程)生成報告。此報告在SSRS中運行速度比查詢在SSMS中運行速度慢。我想知道如何解決這個問題,以及查詢優化在嵌入SQL代碼和存儲過程的報告中的工作方式有什麼不同。疑難解答運行緩慢的SSRS 2005報告

謝謝!

回答

0

從SSMS和報表運行查詢可能存在差異,但SQL Server查詢優化不是這樣。換句話說,SQL Server不關心查詢的來源。

首先,您應該使用SQL事件探查器從兩個源運行時捕獲查詢。您可以查看實際的性能差異是否由於SQL Server上的時間而導致,而不是其他地方。此外,結果可以看出查詢是否相同。 SSRS可能使用參數化查詢,它實際上與您在SSMS中運行的不同。

是否有大量的數據返回到報表?您可能會看到時間差異,因爲結果會更快返回到SSMS。

0

存儲過程和查詢通過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' 

在執行報告時還要保持探查器運行,以便您可以看到幕後發生了什麼。

希望它有幫助。