我编写了一份报告,每天由几百个用户执行,数据集的底层存储过程只需几毫秒即可执行。根据ReportServer.dbo.ExecutionLog3表,我注意到TimeDataRetrieval经常显示5-10秒。AdditionalInfo列显示ExecuteReaderTime如预期的几毫秒,TotalTimeDataRetrieval显示5-10秒。我能做些什么来减少每个报表执行的TotalTimeDataRetrieval?
一些更有用的事实。服务器本身有128 GB的RAM用于SSRS和OS,因此它不是内存约束。检索到的行数为1-20行,估计内存使用量在1000 of以下。
我最好的猜测是,打开到数据库的连接大约需要5-10秒。我相信这可以通过ConnectionOpenTime列中的AdditionalInfo属性来证实。它显示5-10秒,ConnectionOpenTime和ExecuteReaderTime之和等于TotalTimeDataRetrieval。也许有一种方法可以强制SQL Server使连接保持较长时间打开?也许工作线程在空闲超过几秒钟后就被杀死了?
发布于 2022-02-15 21:09:30
哇这是个很老的问题。我相信我已经找到了这个问题的答案,但你得看看它是否对你有帮助。
使用跟踪至少应该让您知道连接时间是慢的,还是查询时间慢.
我按照指示找到了这里。
我将在这里列出详细信息,以防链接中断:
首先,将报表服务器配置为打开跟踪
本机模式报表服务器的配置设置您可以从中的“服务器属性”页面打开或关闭报表执行日志记录。EnableExecutionLogging is和Advanced属性。默认情况下,日志条目保存60天。超过此日期的条目将于每天凌晨2:00移除。在一个成熟的安装,只有60天的信息将在任何特定的时间。不能对记录的行数或条目类型设置限制。要启用执行日志记录:使用管理权限启动。例如,右键单击Management图标,然后单击“以管理员身份运行”。连接到所需的报表服务器。右击服务器名称并单击“属性”。如果禁用“属性”选项,请验证您使用管理权限运行。单击日志记录页。选择“启用报表执行日志记录”。要启用详细日志记录:您需要启用前面步骤中描述的日志记录,然后完成以下操作:在“服务器属性”对话框中,单击“高级”页。在用户定义部分中,将ExecutionLogLevel更改为详细。该字段是一个文本输入字段,两个可能的值都是详细的和正常的。
接下来做一些报告。
查询ReportServer数据库,该数据库将具有以下视图:
Use ReportServer
select * from ExecutionLog3 order by TimeStart DESC最后一列是名为AdditionalInfo的XML列。
对于每个数据集,它将说明连接所需的时间以及获取数据的时间。下面是一个示例:
...
<Connections>
<Connection>
<ConnectionOpenTime>4540</ConnectionOpenTime>
<DataSets>
<DataSet>
<Name>CourseAreas</Name>
<RowsRead>18</RowsRead>
<TotalTimeDataRetrieval>4554</TotalTimeDataRetrieval>
<ExecuteReaderTime>11</ExecuteReaderTime>
</DataSet>
</DataSets>
</Connection>
...看这里,它花了高达4540毫秒连接到数据库!实际上是本地数据库服务器。只有11 to才能运行查询。有点不对劲..。
因此,现在我转到运行报表服务器的机器来配置它:http://localhost/reports
我浏览了主页->相关文件夹->相关数据资源。ConnectionString有本地机器的IP地址(甚至不是它的主地址.)我将其更改为"localhost",并测试了连接。是瞬间的。可能使用内存连接而不是TCP/IP,我不确定。
在进行更改之前,按下大约需要5s才能返回,就像跟踪中报告的那样。我应用了更改,测试连接立即返回。在单击Apply之后,我验证了我的报告现在正在返回不到一秒钟的时间。一些建立了三个数据集连接的报告已经占用了15s或更长的时间,现在它们应该是次秒级的。
问题解决了!
https://dba.stackexchange.com/questions/32918
复制相似问题