SSRS 报告产品中速度非常慢,但 SQL 查询运行速度很快

2024-04-06

我花了几个小时解决这个问题,我需要一些新的视角。 。 。

我们在 SSRS 中有一个相对简单的报告设置,简单的矩阵,列位于顶部,数据点向下。报告背后的 SQL 查询是“中等”复杂性——有一些子查询和几个连接,但没有什么真正疯狂的。

报告几个月来一直运行良好,最近变得非常慢。比如,15-20 分钟即可生成报告。我可以将 SQL 查询从报表设计器剪切并粘贴到 SQL Mgmt Studio 中,替换必要的变量,并且它会在不到 2 秒的时间内返回结果。我什至使用 SQL Profiler 来获取exact查询 SSRS 正在执行的查询,并将其剪切并粘贴到 Mgmt Studio 中,仍然是同样的事情,亚秒结果。指定的参数和日期范围没有任何区别,我可以设置参数以返回小型数据集( 10,000 行),但结果仍然相同;在 Mgmt Studio 中速度超快,但只需 20 分钟即可生成 SSRS 报告。

到目前为止我已经尝试过的故障排除: 删除并在 SSRS 中重新部署该报告。 在多台计算机和 SSRS 服务器上的 Visual Studio IDE 中进行了测试,两个地方的速度相同(约 20 分钟) 使用 SQL Profiler 监视执行报告的 SPID,捕获正在执行的所有 SQL 语句,并在 Mgmt Studio 中单独(和一起)尝试它们 - 在 Mgmt Studio 中运行速度快(


检查两者的执行计划,以确保参数嗅探和/或 set_options 中的差异的组合不会生成两个单独的执行计划。

这是我在从 ADO.Net 和 SSMS 执行查询时遇到的场景。当使用不同的选项创建不同的执行计划时,就会出现问题。 SQL Server利用传入的参数值来尝试进一步优化生成的执行计划。我发现每个生成的执行计划使用了不同的参数值,从而产生了最优和次优计划。我目前找不到用于检查此问题的原始查询,但快速搜索显示了与同一问题相关的这篇文章。

http://www.sqlservercentral.com/blogs/sqlservernotesfromthefield/2011/10/25/multiple-query-plans-for-the-same-query_3F00_/ http://www.sqlservercentral.com/blogs/sqlservernotesfromthefield/2011/10/25/multiple-query-plans-for-the-same-query_3F00_/

如果您使用的是 SQL Server 2008,还有一个通过查询提示提供的替代方案,称为“OPTIMIZE FOR UNKNOWN”,它本质上禁用参数嗅探。下面是一篇文章的链接,该文章帮助我对此功能进行了原始研究。

http://blogs.msdn.com/b/sqlprogrammability/archive/2008/11/26/optimize-for-unknown-a-little-known-sql-server-2008-feature.aspx http://blogs.msdn.com/b/sqlprogrammability/archive/2008/11/26/optimize-for-unknown-a-little-known-sql-server-2008-feature.aspx

对于 2008 年之前的版本,上述方法的替代方法是将参数值存储在过程内的局部变量中。这与上面的查询提示的行为方式相同。该技巧来自下面的文章(在编辑中)。


Edit

经过更多搜索,发现了一篇文章,其中对主题进行了非常深入的分析,以防有任何用处,链接如下。

http://www.sommarskog.se/query-plan-mysteries.html http://www.sommarskog.se/query-plan-mysteries.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSRS 报告产品中速度非常慢,但 SQL 查询运行速度很快 的相关文章

  • 如何通过排序、分区和分组进行行编号

    我需要通过排序 分区和分组进行行编号 订购依据IdDocument DateChange 划分为IdDocument并分组依据IdRole 问题尤其出在分组上 从例子中可以看出 NumberingExpected DENSE RANK 必须
  • 如何在 UPDATE 子句中使用 ROW_NUMBER()? [复制]

    这个问题在这里已经有答案了 ROW NUMBER 仅适用于SELECT中的条款MS SQL Server 但我想用它进行更新 如下所示 Update MyTab Set MyNo 123 ROW NUMBER over Order By I
  • TSQL alter table 添加级联删除和更新约束

    我正在尝试在 tsql 中创建更新和删除约束 我尝试了几种不同的方法 现在我有点困惑和沮丧 看起来很简单 我知道你无法改变现有的约束 所以我不确定如何做到这一点 alter table AllowedCars add constraint
  • CTE 和 TEMP 表之间的主要区别是什么?

    使用有好处吗CTE s common table expressions 而不是使用temp tables 我对它们进行了性能测试 但我找不到它们之间有多大区别 使用有哪些优点和缺点CTE S CTE 和临时表之间最大的区别可能是 CTE
  • 更改 ssrs 图表中的条形填充颜色

    SO Post https stackoverflow com questions 4993343 ssrs field expression to change the background color of the cell 目前我的
  • 通过实体框架创建记录时未插入数据库默认值

    我在 sql server 2008 中有一个登录记录表 其列结构如下 LoginId int identity UserId int LoginDateTime Allow nulls false default value getdat
  • sql 将单行转换为键/值列

    我有一个返回 1 行的 SQL 查询 其中包含多个列标题 Col 1 Col 2 Col 3 val 1 Val 2 Val 3 有没有办法将此行转换为 2 列 即 Col 1 Val 1 Col 2 Val 2 Col 3 Val 3 这
  • 实体框架 4 存储过程调用超时

    我有一个导入到 EF4 中的存储过程 当我在 30 秒后使用某些参数调用它时 它会抛出超时错误 在 SQL Server Profiler 中 我可以看到使用正确参数的存储过程调用仅花费了 30 秒多一点 这是我的应用程序的超时时间 然而
  • 将用户定义的表传递给存储过程

    我有一个用户定义表 我正在将其从存储过程中传递到存储过程中 DECLARE tmpInput MyTableType Table is populated from an INPUT XML exec ValidateInputXML SE
  • 确定表/数据库的字符集?

    可以运行什么 T SQL 命令来查找 SQL Server 中表或数据库的字符集 编辑 服务器版本 Microsoft SQL Server 2008 R2 RTM 10 50 1600 1 X64 您可以使用检查版本 SELECT VER
  • SQL查询where参数为null不为null

    我正在尝试执行 SQL 查询并根据参数是否为空或否动态构建 where 条件 我有这样的事情 SELECT tblOrder ProdOrder tblOrder Customer FROM tblOrder CASE WHEN Order
  • sp_getapplock 无事务

    我正在实现内部没有事务的存储过程 事实上 它会 但仅限于特定地点 以将时间减少到最少 存储过程的本质是我一次只想运行一个 我尝试使用 sp getapplock 但很快发现它需要在事务内部 是否有其他选择可以在整个过程上锁定但不将其包装到事
  • SAS SQL 传递

    我想知道在这段代码中 SAS SQL 传递中首先执行的是什么 Connect To OLEDB As MYDB DBConnect Catalog MYDB Create table MYDB extract as select put P
  • SQL Server:将 GROUP BY 的结果拆分为单独的列

    我有一个 SQL Server 2008 R2 数据库 其中包含大约 5 亿行数据 目前看起来像这样 ID Eventtype 201 1 201 3 201 4 201 1 201 1 664 1 664 0 664 1 664 3 我似
  • 如何查看SQL Server 2008中表空间的总使用量?

    在 SQL server 2008 中 我如何 通过 SQL 查询 找到 SQL Server 2008 R2 的特定实例 或所有实例 的表空间使用百分比 另外 获取 SQL Server 的所有命名实例的列表的最佳方法 查询 是什么 这是
  • 更新多行而不循环

    我想在更新语句中一次更新多行而不使用循环 我有下表 其中包含一些记录 如下所示 Table create table test col1 int col2 int col3 varchar 20 col4 datetime name var
  • 在 where 子句中使用 CASE 时出现语法错误

    类似的问题已被问到here https stackoverflow com questions 22001787 using if condition in where clause 无论如何 我遇到了语法错误 我无法弄清楚 这是我的代码
  • 在 OLAP 多维数据集中,过滤属性时总计错误

    用户尝试检查每个销售人员的销售额 样本数据 Salesperson Sales Amount 001 1000 002 500 003 750 Grand Total 2250 看起来不错 但我们有以下层次结构Company gt Clas
  • 尝试从 Business Intelligence Studio 预览报表时出现错误“子报表‘Subreport1’的数据检索失败”

    我知道以前曾有人问过这个问题 但所有问题都是针对使用 C 或 VB NET 代码访问的报告 我的问题是 我正在使用商业智能工作室构建和访问报告 我基本上是在尝试为报告添加子报告 并且我从参数中确保它们没问题 但是 当我尝试访问包含子报表的报
  • SQL Server 2008 R2 内连接无法匹配 varchar 字段,因为它包含特殊字符

    我们正在将 Microsoft SQL Server 2008 R2 用于我们的经典 ASP 应用程序之一 我们有两张表 TableA TableB TableA有以下列 InstName varchar 1024 TableB有这些列 I

随机推荐