【问题标题】:SqlDataSource Timeout. OK in Management StudioSqlDataSource 超时。在 Management Studio 中确定
【发布时间】:2009-10-14 20:39:31
【问题描述】:

在我继承的代码中,我有一个 SqlDataSource,它有一个相当复杂的选择语句,对于某些 SelectParameters,总是超时(“超时已过期。在操作完成之前超时时间已过或者服务器没有响应。”)。

当我在 Management Studio 中使用相同的参数运行完全相同的查询时,查询从不超时并且总是花费不到一秒的时间。

有人知道这里可能出现什么问题吗?我无法理解它。

【问题讨论】:

    标签: .net sql sqldatasource


    【解决方案1】:

    只是在黑暗中拍摄:参数实际上并不相同。在 SSMS 中,您为查询传递 ASCII 参数,而在 ADO.Net 中,您传递 Unicode 参数。当myValue 是字符串时,SqlCommand.Parameters.AddWithValue("@myParam", myValue) 将添加 NVARCHAR 类型的参数。由于 SQL 中的转换规则,如果您有 SELECT ... FROM ... WHERE myField = @myParam 并且 myField 是 Ascii (VARCHAR) 并且 @myParam 是 Unicode (NVARCHAR),那么执行必须进行表扫描,不能在 myField 上使用索引,从而导致比较糟糕的性能到 SSMS 执行。

    正如我所说,这只是在黑暗中拍摄,但这是一个常见的陷阱,调试起来相当微妙。

    【讨论】:

    • 我喜欢在黑暗中拍摄,那是相当有说服力的。我确实在 SqlDataSource 上设置了 SelectParameters 的 DbType/Type,但这并没有帮助。另外,请注意 SqlDataSource 并不总是超时。仅针对某些参数。对于那些,它会持续超时,而 Management Studio 不会。
    • 如果您 1000% 确信(不,额外的 0 不是拼写错误)SSMS 和 ADO.Net 中的查询是相同的,您应该比较执行计划(Profiler 可以向您显示ADO.Net 语句的图形执行计划,捕获 Plan XML 事件)。如果计划不同(所以不是某些 ADO.Net 客户端行为不端),那么您可以查看的一个地方是 SET 选项。查看 ADO.Net 连接和 SSMS 连接的 sys.dm_exec_sessions 并比较它们,看看有什么不同,然后检查 MSDN 以了解不同 SET 的含义
    • 是的,它们是相同的(从 SQL Profiler 复制过来的)。你是对的......这是设置选项。我更改了“事务隔离级别”,它不再超时。我希望我可以将您和 KM 的答案都标记为答案,因为他也走在了正确的轨道上。但最终,你的最后一条评论真的帮助我解决了这个问题,所以回答你。谢谢!
    • 在我的例子中,保持超时的复杂查询在 where 子句中有“
    【解决方案2】:

    可能是锁定/阻塞,如果人们在数据库中工作,您的选择可能会等到他们的事务完成。根据数据库中的其他事务,超时将被命中或错过。

    在管理工作室中,运行SET SHOWPLAN_ALL ON,然后运行您的查询。在输出中查找“SCAN”。如果你有一个表或索引扫描,你更有可能成为锁定/阻塞的受害者,因为你必须处理整个索引/表,任何锁定一行的人都会迫使你等待。

    当您运行应用程序时,屏幕没有刷新在管理工作室中快速运行:

    EXEC sp_lock 
    

    它将为您提供一些当前正在进行的锁定的基本信息。

    【讨论】:

    • 无论我是否在 Management Studio 中都不会发生锁定吗?我在 Management Studio 中多次运行查询;它永远不会超时。使用 SqlDataSource,它总是如此。或者是否有一些设置强制 SqlDataSource 始终等待锁定而 Mangement Studio 根本不等待?
    • @Stefan,编辑你的问题,说 从 SqlDataSource 运行时总是超时,但从管理工作室运行时永远不会超时,这是一条重要线索。
    【解决方案3】:

    尝试以下,也许这会澄清发生了什么:

    1. 在 sql profiler 中,捕获复杂 SQL 语句转换成的确切语句,并在 Viual Studio 中运行。

    2. 当有问题的 sql 语句正在运行时,请在 management studio 中检查activity monitor。它可以给你一个想法,什么可能阻塞了 sql。

    3. 查看同时运行的其他内容很重要。应用程序是多线程的吗? sql连接是否在使用后立即关闭/处理(如果没有,它可能不会及时关闭)?多线程使用同一个sql连接吗?

    【讨论】:

      猜你喜欢
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-08
      • 2010-11-02
      • 2015-06-05
      • 2010-09-21
      • 2015-11-05
      相关资源
      最近更新 更多