1

我正在使用SSRS 2008 R2和報告生成器3.0。我有一個需要幫助的級聯報告問題。第一份報告運行良好。點擊報告中的鏈接將@processID參數傳遞給後續報告。替換2008 R2中的參數SSRS

現在,當在SSMS中直接使用字符串而不是參數運行查詢時,需要1秒鐘的時間。當我通過參數SSRS運行它大約需要15分鐘。我讀過SSRS不能很好地處理參數。我想要做的是找到一種方法來將參數更改爲一個字符串,然後發送,或者如果有人知道更好的方法。

下面是報告運行查詢:

SELECT  ResultDetail_View.processOid, ResultDetail_View.applicationId, outputItem.outputValue, ResultDetail_View.startTime, ResultDetail_View.resultStatus, 
         ResultDetail_View.statusMessage, ResultDetail_View.endTime, ResultDetail_View.ErrRec, COUNT(Summary.Id) AS SumRec 

FROM   ResultDetail_View LEFT OUTER JOIN 
         Summary ON ResultDetail_View.processOid = Summary.Id LEFT OUTER JOIN 
         outputItem ON ResultDetail_View.outputOid = outputItem.outputItemOid 

GROUP BY ResultDetail_View.processOid, ResultDetail_View.applicationId, outputItem.outputValue, ResultDetail_View.startTime, ResultDetail_View.resultStatus, 
         ResultDetail_View.statusMessage, ResultDetail_View.endTime, ResultDetail_View.ErrRec 

HAVING  (ResultDetail_View.processOid = @processID) 

ORDER BY ResultDetail_View.startTime 
+0

如何在報表中運行查詢?這是一個存儲過程嗎?如果是這樣,這看起來很像[參數嗅探](https://www.brentozar.com/archive/2013/06/the-elephant-and-the-mouse-or-parameter-sniffing-in-sql-server /)這將阻礙SQL Server選擇最佳查詢計劃的能力。 – iamdave

+0

不幸的是,這些是繼承的報告。這些都是特別格式,而不是存儲過程。我發佈的代碼實際上是運行的數據集查詢。我還沒有找到參數嗅探。爲了以防萬一,我已經進行了重新編譯,並且它在SSRS和SSMS中的使用時間仍然相同。 – bwilliamson

+0

您是否在sql server實例上運行跟蹤以確切地查看報表運行時服務器上正在執行的查詢。一旦你有了這些,如果你直接在同一臺服務器上的SSMS中運行它,你應該得到完全相同的性能(無論是好是壞)。這不是一個答案,但至少應該幫助你調查問題。 –

回答

0

不管原來的問題,它看起來像你可以改變你havingwhere不改變查詢結果?如果這種情況肯定會對性能有所幫助。

關於參數嗅探,您是否嘗試過設置本地nvarchar變量並在報告中以這種方式運行查詢?

delcare @processIDLocal nvarchar(50) = @processID; 

select r.processOid 
     ,r.applicationId 
     ,o.outputValue 
     ,r.startTime 
     ,r.resultStatus 
     ,r.statusMessage 
     ,r.endTime 
     ,r.ErrRec 
     ,count(s.Id) as SumRec 
from ResultDetail_View as r 
    left outer join Summary as s 
     on r.processOid = s.Id 
    left outer join outputItem as o 
     on r.outputOid = o.outputItemOid 
where r.processOid = @processID 
group by r.processOid 
     ,r.applicationId 
     ,o.outputValue 
     ,r.startTime 
     ,r.resultStatus 
     ,r.statusMessage 
     ,r.endTime 
     ,r.ErrRec 
order by r.startTime; 
+0

這並沒有改變它運行的時間。這不是參數嗅探問題,因爲直接在SSMS上運行的相同查詢以毫秒運行。 – bwilliamson

+0

@bwilliamson「*作爲直接在SSMS上運行的相同查詢以毫秒運行*」這幾乎是參數嗅探的最大指標...... – iamdave

+0

如果我在重新編譯的兩個位置運行相同的查詢,它是否應該選擇最佳爲每個計劃?此外,如果我在報告構建器中更改數據集查詢以僅使用字符串值而不是@parameter,則它會在13分鐘內運行一秒或兩秒。執行計劃在整個過程中顯示1行到1100萬行之間的差異。 – bwilliamson