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