Reporting Services的性能降低,在QueryAnalyser中速度非常快

时间:2010-01-22 13:35:59

标签: sql-server-2005 reporting-services

我们将SQL Server 2005与Reporting Services一起使用。

我们有很多报告,每个报告都包含一个相对简单的SQL查询 - “相对”我的意思是我们确实有一些联接,但没有比这更糟糕的了。我们不会在查询中调用任何存储过程 - 这不是参数嗅探的情况。

当通过Reporting Services执行其中一个报告(让我们称之为报告A)时,需要很长时间才能完成 - 大约几十分钟甚至几小时。在查询分析器中执行相应的SQL查询时,它会在几秒钟内完成。

从数据库返回的行数可以少至1 - 但报告永远不会完成。

其他报告工作正常。

查看Reporting Services上的ExecutionLog表,我可以看到大部分时间都在TimeDataRetrieval中(我们在这里谈论数百万秒......) - 报告实际完成的那些时间。如果报告是手动中止的,则TimeDataRetrieveal为零,而TimeProcessing则为荒谬的高。

我查看了Reporting Services的日志,但一切看起来都很正常。

现在,在您开始建议“锁定”之前 - 好吧,我们的查询确实启用了nolock提示。

就目前而言,我已经达到了想象力的极限,试图找到错误。任何想法,见解都会很高兴。

/克里斯托弗

5 个答案:

答案 0 :(得分:5)

我最终剥离了查询,基本上是一次一个语句,直到我找到了罪魁祸首。查询中的一个连接在一个不断增长的表(数百万行)中加入,使用“with(nolock index(x))”提示。

在查询分析器中删除索引提示使我得到与Reporting Services相同的结果 - 非常慢查询。这本身就不足为奇了 - 但事实上,通过RS运行的查询似乎没有使用提示。

然后我尝试使用SET FORCEPLAN ON语句再次在RS中运行报告。并且...它工作 - 执行时间现在是几秒钟,应该是。据我了解,FORCEPLAN选项强制SQL Server按照指示的顺序处理连接,并考虑任何提示。

当查询分析器显然将其考虑在内时,是否有人对通过RS的查询忽略提示的原因有任何见解?

答案 1 :(得分:2)

在运行报告时,尝试使用SQL事件探查器执行co catch执行计划。如果您没有任何CONVER_IMPLICIT运算符,例如一般的表/索引扫描,请查看。

http://msdn.microsoft.com/en-us/library/ms190233.aspx

转换会阻止使用索引,如果传递的参数类型与您比较的列不同,则可能会发生转换。

您可能会尝试在报告查询中添加OPTION(RECOMPILE),您的报告可能是parameter sniffing的受害者。

检查您的查询是否使用标量用户定义的函数。他们可能是表演的真正杀手。如果您拥有它们,则可以将它们转换为table valued functions

答案 2 :(得分:2)

我遇到了同样的情况。

在Management Studio中,结果出现在20秒后,但是当我在visual studio中运行报告时,它锁定了系统。

在SQL分析器中,我跟踪了查询并意识到它将我的查询转换为:

    exec sp_executesql N'
                ....................
                ....................' 
, @dateparameter1 = '2010-06-01 00:00:00'
, @datepamareter2 = '2010-06-02 00:00:00'
, @stringparameter=null

我已经检查了执行计划并意识到我是参数嗅探的受害者。

我已经重新组织了我的查询,因为它被告知here,现在它工作正常..

答案 3 :(得分:1)

它也发生在我身上,这是参数嗅探。我使用相同的报告视图作为过滤器,只使用我想要的字段。

我所做的是为过滤器创建一个视图,它已经解决了。

答案 4 :(得分:0)

快速更新:似乎任何执行时间超过30秒的查询都会自动导致Reporting Services超时。虽然SET FORCEPLAN ON解决了某些报告的问题,但仍有问题报告会超时。这些查询在查询分析器中仍然可以正常工作,但执行时间大于30秒。消除了超时设置的所有其他可能问题 - 在SQL服务器上,在IIS中的Reporting Services,rsserver.config中 - 我发现仍然有一个我无法修改的超时。

我怀疑它与ADO.NET默认超时有关,并且微软让我们无法修改此值。

最后,我最终深入了解了查询,并尽最大努力重新排列,并设法从执行时间中剥离了几秒钟。现在,最后,报告正在按预期运行。

然而,这个不可修改的超时让我担心 - 如果执行查询时SQL服务器的负载高于正常值,会发生什么?