Sql server 替换2008 R2 SSRS中的参数
我正在使用SSRS2008R2和ReportBuilder3.0。我有一个级联报告问题,我需要帮助。第一份报告运行良好。单击报告中的链接将@processID参数传递给后续报告 现在,当在SSMS中直接使用字符串而不是参数运行查询时,所需时间不到1秒。当我用参数运行SSRS时,大约需要15分钟。我读到SSRS不能很好地处理参数。我想做的是找到一种方法将参数更改为字符串,然后发送该字符串,或者如果有人知道更好的方法 以下是报表正在运行的查询:Sql server 替换2008 R2 SSRS中的参数,sql-server,sql-server-2008,reporting-services,ssrs-2008-r2,Sql Server,Sql Server 2008,Reporting Services,Ssrs 2008 R2,我正在使用SSRS2008R2和ReportBuilder3.0。我有一个级联报告问题,我需要帮助。第一份报告运行良好。单击报告中的链接将@processID参数传递给后续报告 现在,当在SSMS中直接使用字符串而不是参数运行查询时,所需时间不到1秒。当我用参数运行SSRS时,大约需要15分钟。我读到SSRS不能很好地处理参数。我想做的是找到一种方法将参数更改为字符串,然后发送该字符串,或者如果有人知道更好的方法 以下是报表正在运行的查询: SELECT ResultDetail_Vie
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
不管原始问题是什么,看起来您可以将
having
更改为where
,而无需更改查询结果?如果是这种情况,肯定会有助于提高性能
关于参数嗅探,您是否尝试过设置本地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;
不管原始问题是什么,看起来您可以将
having
更改为where
,而无需更改查询结果?如果是这种情况,肯定会有助于提高性能
关于参数嗅探,您是否尝试过设置本地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;
您如何在报告中运行查询?它是一个存储过程吗?如果是这样的话,这看起来很像会妨碍SQL Server选择最佳查询计划的能力。不幸的是,这些是继承的报告。它们是临时格式,而不是存储过程。我发布的代码实际上就是运行的数据集查询。我还没有发现参数嗅探。为了以防万一,我做了一次重新编译,但在SSR和SSMS中所用的时间仍然相同。您是否在sql server实例上运行了跟踪,以查看报表运行时服务器上正在执行的查询。一旦实现了这一点,如果直接在同一台服务器上的SSMS中运行它,应该会获得完全相同的性能(无论是好是坏)。这不是一个答案,但至少可以帮助您调查问题。您如何在报告中运行查询?它是一个存储过程吗?如果是这样的话,这看起来很像会妨碍SQL Server选择最佳查询计划的能力。不幸的是,这些是继承的报告。它们是临时格式,而不是存储过程。我发布的代码实际上就是运行的数据集查询。我还没有发现参数嗅探。为了以防万一,我做了一次重新编译,但在SSR和SSMS中所用的时间仍然相同。您是否在sql server实例上运行了跟踪,以查看报表运行时服务器上正在执行的查询。一旦实现了这一点,如果直接在同一台服务器上的SSMS中运行它,应该会获得完全相同的性能(无论是好是坏)。这不是一个答案,但至少应该有助于你调查这个问题。这并没有随着时间的推移而改变任何事情。这不是参数嗅探问题,因为直接在SSMS上运行的同一查询以毫秒为单位。@bwilliamson“直接在SSMS上运行的同一查询以毫秒为单位”这几乎是参数嗅探的最大指标……如果我在两个位置运行同一查询并重新编译,它是否应该为每个位置选择最佳计划?另外,如果我在报表生成器中将数据集查询更改为仅使用字符串值而不是@参数,那么它也会在一两秒钟内运行,而不是在13分钟内运行。执行计划显示了整个过程中1行和1100万行之间的差异。@bwilliamson请阅读。您实际上是在描述参数嗅探,只是没有做实际推荐的事情来缓解它,比如使用本地参数。您看到的预期行数的巨大差异是导致计划选择错误的原因。这并没有随着时间的推移而改变任何东西。这不是参数嗅探问题,因为直接在SSMS上运行的同一查询以毫秒为单位。@bwilliamson“直接在SSMS上运行的同一查询以毫秒为单位”这几乎是参数嗅探的最大指标……如果我在两个位置运行同一查询并重新编译,它是否应该为每个位置选择最佳计划?另外,如果我在报表生成器中将数据集查询更改为仅使用字符串值而不是@参数,那么它也会在一两秒钟内运行,而不是在13分钟内运行。执行计划显示了整个过程中1行和1100万行之间的差异。@bwilliamson请阅读。您实际上是在描述参数嗅探,只是没有做实际推荐的事情来缓解它,比如使用本地参数。您看到的预期行数的巨大差异是导致计划选择不佳的原因。