仅在 VS 调试模式下解决 SQL 查询超时

Posted

技术标签:

【中文标题】仅在 VS 调试模式下解决 SQL 查询超时【英文标题】:Resolving SQL query timeout in VS debugging mode only 【发布时间】:2018-10-05 12:55:47 【问题描述】:

考虑到相同的查询在 SSMS 中总是按预期运行,在没有调试的 VS 中以及在运行已安装的桌面应用程序时,任何人都可以建议在 Visual Studio 中调试时出现 sql 查询超时的可能原因。

sql查询比较长,举个简单的例子。

    SELECT t1.field1, t2.field1, t3.field1, t4.field1 FROM 
    table1 t1 INNER JOIN table2 t2 ON t1.id = t2.id INNER JOIN 
    table3 t3 on t1.id = t3.id INNER JOIN table4 t4 ON t1.id = t4.id 
    WHERE t3.char = ‘N’ AND t4.id2 = 1

该查询仅提取大约 500 条记录,因此通常的执行时间在 1 秒以下。我从变量中执行了 sql 字符串,还尝试调整程序以从存储过程和表函数运行它,所有三个选项在 VS 中导致相同的超时,而仅使用调试模式。

当问题发生时,sql执行队列被阻塞,除非我停止调试模式,有时甚至不得不重新启动VS,否则在SSMS中没有sql命令可以完成。

C#代码是

   using (IDbConnection db = new SqlConnection(myconnection))
        
            return new ObservableCollection<MY_INFO>(db.Query<MY_INFO>
           ("exec sp_mysp @MY_ID", new  MY_ID = myid , commandTimeout: 60).ToList());
        

【问题讨论】:

你用什么来获取数据(ORM,ADO等)? 谢谢,这是 Dapper,会用更多信息更新问题 所以它总是在 DEBUG 模式下失败,即使没有任何断点? 我会说它主要是在调试模式下失败,所以更令人费解的是它偶尔会执行。它始终在实时应用程序版本中执行,无需调试模式或 SSMS。没有断点。 【参考方案1】:

下面的帖子帮助我解决了Query times out from web app but runs fine from management studio的问题。

我更改了以下设置以匹配不同于前端用户登录和前端应用程序所需设置的 sql server 登录。

发件人:

set arithabort off
set language us_english  
set dateformat mdy  
set datefirst 7

收件人:

set arithabort on
set language uk_english  
set dateformat dmy  
set datefirst 1

这在很大程度上解决了问题,但仍然偶尔会出现延迟。最后我决定从 VMWare Win 10 VM 切换到 Mac Pro Docker using this guide,现在一切都按预期运行了。

希望这对某人有所帮助。

【讨论】:

以上是关于仅在 VS 调试模式下解决 SQL 查询超时的主要内容,如果未能解决你的问题,请参考以下文章

System.Data.SqlClient.SqlException(等待操作超时)仅在调试时

仅在 Flutter 的调试模式下运行的应用程序

C++ VS 调试代码,设置你自己的调试标志

如何调试特定 SQL 偶尔会导致 BigQuery “请求超时。请重试”

解决VS调试时断点不会命中

VS2015创建的C++程序在Debug模式下不能调试