7

环境


数据库服务器(DWH 产品和开发 + SSRS 产品)

  • 赢 XP SP3
  • SQL Server 2008 耳鼻喉科
  • 企业局域网
  • DWH 没有远程查询超时限制,即设置为0
  • 600为 SSRS 数据库服务器设置的远程查询超时秒数
  • 对并发连接没有限制,即它们设置为0
  • KeepAliveSQL Server 的TCP/IP属性 =30000

开发盒

  • 赢 XP SP3
  • 2008年投标

共享数据源(由 .rdl 使用)

  • 使用服务器的机器名,没有别名
  • 权限一切正常


问题


查看报告的“预览”选项卡时,BIDS 返回的错误在大约 1 分钟后出现(在 SSMS 中查询需要约 1 分 10 秒 -编辑:2012-10-16现在在 SSRS 本身中复制了错误通过将报告部署到报告管理器并尝试运行报告:在下面添加了异常堆栈跟踪):

本地报告处理过程中发生错误。

报告处理过程中发生错误。

数据集“MainData”的查询执行失败。

从服务器接收结果时发生传输级错误。(提供者:TCP 提供者,错误:0 - 指定的网络名称不再可用。)

  • 该查询已经过测试,最终用户帐户具有db_datareader权限,针对 prod 和 dev db 服务器,并且在 SSMS 中工作正常。
  • 此帐户用于最终用户在运行时执行 .rdl。
  • SSMS 用于验证查询在语法上是否正确,并返回完整且完整的结果集,没有错误和警告。


查询结构(为简洁起见列出)


SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT ON
SET ANSI_WARNINGS OFF

/********************************************************** 
    CTE to be used to clean strings
***********************************************************/
;WITH
    CTE_1           AS  ( SELECT SomeData )
    ,CTE_2          AS  ( SELECT SomeData )
    ,Recursive_CTE  AS  ( SELECT SomeData )     -- String cleaning performed here
    ,CTE_3          AS  ( SELECT SomeData )

/**************************     
 Data set returned here
***************************/
SELECT
    Column_1
    ,Column_2
    ,Column_3
    .
    .
    .
    ,Column_n
FROM
    Fact
    INNER JOIN  Dimension_1     AS 1        ON Fact.Key_1   = 1.Key_1
    INNER JOIN  Dimension_2     AS 2        ON Fact.Key_2   = 2.Key_2
    INNER JOIN  Dimension_3     AS 3        ON Fact.Key_4   = 3.Key_3
    INNER JOIN  Dimension_5     AS 4        ON Fact.Key_4   = 4.Key_4
    LEFT JOIN   CTE_3           AS clean    ON 4.Key_4      = clean.Key_4   -- Clean names returned in query and used in GROUP BY clause    
WHERE
    Condition_1 = Test_1
    AND Condition_2 = Test_2
    AND Condition_3 = Test_3
    .
    .
    .
    AND Condition_n = Test_n
GROUP BY
    Group_1 
    ,Group_2
    ,Group_3
    .
    .
    .
    ,Group_n
ORDER BY
    Group_1 
    ,Group_2
    ,Group_3
    .
    .
    .
    ,Group_n


注释(不确定这是否有帮助):

  • 递归 CTE 只执行 24 次递归。
  • 所有的钥匙都是PRIMARY KEY CLUSTERED INDEXES


问题)


  1. 从哪里开始诊断问题实际上是什么?
  2. 发现问题后如何解决?


到目前为止我所做的...


2012-10-15

  • 在谷歌机器上搜索无济于事。
  • 与看到这种情况的其他团队成员交谈,他们认为这可能与性能有关,即查询运行时间过长,或者他们认为 SSRS 或连接器执行的 SQL 代码验证/语法检查可能更严格它用。

2012-10-16

ERROR: Throwing Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: Query execution failed for dataset 'DataSet1'., ;
 Info: Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: Query execution failed for dataset 'DataSet1'. ---> System.Data.SqlClient.SqlException: A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The specified network name is no longer available.)
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
   at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
   at System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
   at System.Data.SqlClient.TdsParserStateObject.ReadByte()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
   at Microsoft.ReportingServices.DataExtensions.SqlCommandWrapperExtension.ExecuteReader(CommandBehavior behavior)
   at Microsoft.ReportingServices.OnDemandProcessing.RuntimeDataSet.RunDataSetQuery()
   --- End of inner exception stack trace ---
  • 上述异常在同一数据集的日志中多次出现 -> 可能的原因可能是 CTE 中的递归?
  • 我检查了 DWH 数据库服务器和 SSRS 数据库服务器级别的 TCP/IP 设置。两者都将KeepAlive属性设置为30000,即 30 秒 -> 断开连接的可能原因?
  • 在此处找到针对 Visual Studio 2005 的查询的类似问题解决方案(基于堆栈跟踪) 。我取消选择Tools > Options > Database Tools > Query and View Designers > Cancel long running query(设置为 30 秒)。没有变化(我相信,一旦部署到 SSRS 服务器,此客户端设置也不会影响报告,但我想我会试一试)
  • 发现这个状态OBDC connection attempt when server is not ready to process a new local connection, possibly due to overload-> 当 SSRS 将查询提交到 DWH 服务器时,递归 CTE 是否会导致这样的过载(即使我没有进行 ODBC 连接)?
  • 发现表明 SSRS 不喜欢虚拟表(没有提及原因,也没有提供参考)-> 可能需要重写查询?
  • 回复评论:网络诊断
4

5 回答 5

0

首先,你必须找到问题所在。

当您使用运行 Profiler 打开报告时,您能检查发生了什么吗?使用事件审计登录、审计注销、异常、SQL:Stmt:Starting/Completed 启动跟踪。在您尝试打开报告后检查结果并告知我们。

于 2013-04-05T13:05:22.023 回答
0

建议:当查询变得复杂并且 SSRS 开始抱怨时,将查询包装到数据库中的视图或存储过程中,在 SSMS 中测试新的(更简单的)查询,然后查看相同的简单查询在 SSRS 中是否有效。

在所有情况下,使用 SQL Server Profiler 和其他诊断工具来查看数据库的实际运行情况。

于 2014-07-03T23:03:32.550 回答
0

似乎是超时问题......但请尝试以下操作:

如果要确保不使用相同的执行计划,请尝试选项(重新编译)以使用不同的计划。

这可能/可能不会导致解决问题,但至少您将缩小范围并检索您在 SSMS 中所做的数据。

于 2015-11-11T14:11:41.677 回答
0

尝试从写入繁重的数据库中读取时遇到此错误。

SQLEXCEPTION: Transaction was deadlocked on lock resources with another process and has been chosen as the deadlock victim.

这将导致您描述的 SSRS 行为,日志中有以下线索:

---> System.Data.SqlClient.SqlException: A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The specified network name is no longer available.)

如果这是您的问题,可以尝试以下方法:

  • 创建没有索引的临时表以镜像查询中的事实和暗淡表。在没有任何连接的情况下使用您需要的数据填充它们,然后添加索引。仅在这些临时表之间执行连接。
  • 考虑使用 READ UNCOMMITTED 事务隔离来调试问题,或在查询中添加 NOLOCK 提示。如果这提高了性能,您可能会遇到与我遇到的相同的死锁问题。
  • 从长远来看,您可能希望从不大量写入的数据库中读取数据,例如。包含夜间数据的数据库报告版本。
于 2018-08-30T17:50:30.040 回答
0

一个新的答案促使我写这个答案来结束这个问题,虽然这还没有完全验证,但据我所知,该问题不会出现在更高版本的 SQL Server 工具中(即现在跨工具的相同结果将发生)。

原因(根据记忆)是 SSMS 与 SSRS 使用不同的客户端连接,在 2008 版本中,我相信 SSRS 使用的是 ADO.Net 连接器,而 SSMS 使用的是不同的东西(不记得现在是什么了)。

我在研究这个问题时遇到了一篇旧文章(5-6 年前),它基本上列出了 SQL Server 堆栈工具之间的不同客户端连接类型(我刚刚尝试再次搜索 30 分钟以找到它,但是鉴于这些工具现在已有 10 年的历史,我没有成功找到它)。我还记得在 2012 年或 2014 年发布时,我看到微软的一篇文章说客户端类型将在所有工具中标准化。

因此,除非您使用 2008 工具(或更低版本),否则您不会遇到它在 SSMS 中工作但在 SSRS 中失败的问题,它很可能在两者中都失败,或者在两者中都工作。

如果您仍在使用 SSMS 2008,我相信您可以设置高级查询执行选项,请尝试查看以下连接客户端类型选项:

  • Tools > Options... > Query Execution > SQL Server > General
  • Tools > Options... > Query Execution > SQL Server > Advanced
于 2018-09-05T04:42:49.447 回答