4

我在 SSRS 2012 中运行一个非常基本的报告。我只是从表中检索一些数据,并且我在查询的 Where 子句中使用了一个参数。如果我在 SSRS 查询中对参数进行硬编码,则查询运行速度很快(不到 5 秒),但如果将其保留为动态选择的参数,则查询需要 5 分钟以上才能呈现。这是一个类似于我正在使用的抽象查询:

Select Col1, Count(*)
From Tbl1
Where Col2 = @Para1
Group By Col1
OPTION (RECOMPILE);

我已经尝试在查询中使用 OPTION (RECOMPILE) 来解决参数嗅探问题。我还检查了数据类型,Col2 是 CHAR(2),Para1 是 TEXT,所以在运行时不需要转换。

有什么想法可能导致这种情况吗?

4

4 回答 4

2

我遇到了类似的问题,但仅在连接到 Oracle 数据库时。当我对查询中的参数进行硬编码时……效果很好……将参数传递给查询,这将需要很长时间。奇怪的是,某些参数只需要永远。在我的情况下,当我检查日志时,渲染时间是永远的。(还应该提到这是一个多选参数......无法解决这个问题)

奇怪的解决方案:

我没有将参数传递到查询中,而是将其作为过滤器传递到数据集中。有人会认为这只会增加 ssrs 服务器的负载,因为您要通过网络发送更多数据以供其处理……从而增加渲染时间,但区别在于白天和黑夜。该报告现在运行良好。

老实说无法解释。

我写的报告比我对 SQL Server 数据源的数量还要多,而且在连接到 Oracle 时我只看到过这个(以及一些其他奇怪的事情)。但是,如果您遇到同样的问题,可能值得一试,并且您应用的参数实际上并没有限制数据那么多。(就我而言,大多数人无论如何都在运行“全部”。

如果您不熟悉在数据集上使用过滤器。转到此链接并查找标题“使用具有多值参数的过滤器”(也适用于非多值参数) http://www.mssqltips.com/sqlservertip/2866/sql-server-reporting-services -使用多值参数/

于 2014-03-07T03:25:26.173 回答
1

我在使用查询加载数据的报告中遇到了类似的问题。就我而言,我必须支持架构团队建立的开发模式(在 SSRS 数据集中使用直接查询)。我不能使用过滤器,因为未过滤的数据量和安全要求(仅从数据库中提取请求的数据)。

所以我的解决方案是攻击转换。我声明了表变量,用来自 SSRS 参数的转换选择值填充这些变量,并在WHERE … IN (…)表达式中使用这些表变量。这仅涵盖了所有需求查询有限的数据量安全的数据访问并解决了 NVARCHAR 到 VARCHAR 转换的减速问题。

查询中的解决方案如下所示(@pSelectedValues变量映射到报告中的选择参数,在我更改之前它已经存在):

DECLARE @tMySelectedParameterValues TABLE( SelectedValue varchar(255) NULL );

INSERT INTO @tMySelectedParameterValues

SELECT DISTINCT EntityStatusStatusName
FROM      dbo.t_MyReferenceData
WHERE     ValueForParameters IN (@pSelectedValues);

... main selection and from parts ....

WHERE keyValues IN (SELECT SelectedValue FROM   @tMySelectedParameterValues )
于 2016-05-24T16:18:41.713 回答
1

我遇到了同样的问题。我对 SQL Server 运行 SQL Server Profiler 嗅探查询以 确定报告慢的地方,并发现查询运行了 20 秒。查询包装在exec sp_executesql中。我将查询复制到 SSMS 并发现它运行了 20 秒。将查询转换为直接 SQL 使其运行 1 秒。啊哈!

回到 exec sp_executesql sql,果然有一个 IN 子句:

operid IN  (N''XICL002'',N''XICL005'',N''XICL026'',N''XICL028'...

operid 是 decared varchar(32) 而N前缀强制参数为 NVARCHAR。删除N使exec sp_executesql sql 在 1 秒内运行。

就我而言,我能够修改报告。IN 子句由多选参数 (p_operators) 填充。我更改了报告查询以使用生成 p_operators 列表的参数从视图中获取操作符列表。

operid IN (SELECT oper_id  FROM foo WHERE (foo1 IN (@p_foo1)) AND (foo2 IN (@p_foo2)) AND ...

基本上,将参数从 NVARCHAR 转换为 VARCHAR 会导致性能下降。似乎 SSRS 应该提供指示参数数据类型的选项 - 而不仅仅是“文本”。此外,在开发模式下记录一些查询也会很好。

(我希望我提供的信息足够有用。由于公司政策,我不能写太多)

于 2015-11-11T17:54:24.743 回答
0

三件事:

  1. 为什么必须使用重新编译?除非您的计划在每次不需要时都特别想重新考虑它的执行。特别是如果您要说明您的查询很简单。SSRS 在 SQL 之上做它自己的解释,所以为它添加更多的东西只是在自找麻烦。如果您必须进行重新编译,您可能希望将其放入 proc 中,以便封装所有逻辑以供 SQL 引擎理解。

  2. 参数有时会减慢任何东西是SSMS中带有参数的查询也很慢吗?您提到它是快速硬编码的,但没有在 SSMS 中使用参数对其进行测试。我有时看到 SSMS 上的参数很慢。

  3. 您可以“欺骗” SSRS 的参数部分,只需稍加了解即可。在参数特别糟糕的极端情况下,您可以构建一个在运行时运行的表达式。在您的数据集选项上,单击表达式的“fx”,然后执行以下操作:

    ="Select Col1, Count(*)
    From Tbl1
    Where Col2 = " & Parameters!Para1.Value
    

只要您的类型是文本,这应该会产生一个合法的字符串,然后在运行时进行评估。需要注意的是,您的字段可能不会首先自行填充,因此您可能希望进行实际查询,让它们自动填充,然后返回并将函数放入。否则您将不得不在左侧窗格中手动设置字段说明“字段”的数据集,恕我直言。

于 2013-04-03T15:46:36.057 回答