SELECT从程序中超时,但可以从SQL Server Management Studio运行

Jef*_*ffR 6 c# sql sql-server

我在执行SQL SELECT时遇到超时.

我连接到数据库:

using (SQLConnection conn = SQLConnection(@"Data Source=mydbServer;Initial Catalog=mydb;Integrated Security=true;Timeout=180");
{
    conn.Open();
Run Code Online (Sandbox Code Playgroud)

并成功连接.

在使用{}我设置的内部:

string query = @"SELECT a.field, a.timestamp " +
               "FROM mydb.dbo.myTable1 a WITH(NOLOCK) " +
               "LEFT JOIN [myOtherdbServer].myOtherdb.dbo.MyTable2 b WITH(NOLOCK) " +
               "ON a.field = b.field " +
               "WHERE b.field is NULL " +
               "AND a.timestamp >= '2015-05-01 00:00:00.000' " +
               "AND a.timestamp < '2015-06-01 00:00.00.000'";
Run Code Online (Sandbox Code Playgroud)

并执行命令:

using (SQLCommand queryCmd = new SQLCommand(query, conn)
{
    queryCmd.CommandTimeout = 300;

    using (SQLDataReader rdr = queryCmd.ExecuteReader())
    { 
Run Code Online (Sandbox Code Playgroud)

SQLCommand抛出超时异常:"操作完成之前经过的超时时间或服务器没有响应".

如果我在运行我的程序的同一系统上使用SQL Server Management Studio,并且作为运行我的程序的同一用户,并执行相同的SELECT,它将在1秒内完成并返回数千行.

现在这种情况一直在发生.几天前它正在运作.我应该寻找什么?我很困惑,因为相同的SELECT可以从SQL Server Management Studio运行.SQL SMS是否使用不同的连接?

Y.S*_*Y.S 4

“如果我在运行程序的同一系统上使用 SQL Server Management Studio,并以运行程序的同一用户身份执行相同的 SELECT,则它会在 1 秒内完成并返回数千行。”

  1. SQL Server Management Studio 中的执行时间更好可能有多种原因。这一次,结果被缓存,也很可能是您在时间戳列上缺少索引
  2. 另外,你的应用服务器和你的sql服务器位于同一台服务器上吗?否则,这可能会增加延迟并导致超时。
  3. 链接服务器可能是一个问题,除了延迟考虑之外,我不确定 NOLOCK 语句是否足以确保您试图在远程服务器上实现的目标。您很有可能需要在远程服务器上创建一个包含 NOLOCK 语句的视图。

现在这种情况一直在发生。几天前它还在工作。我应该寻找什么?我很困惑,因为 SQL Server Management Studio 中也可以使用相同的 SELECT。SQL SMS 是否使用不同的连接?

通常,当某件事正在工作而现在停止工作时,就会发生某些事情的改变。开始故障排除,直到找到问题所在,查找索引更改、代码架构修改、甚至 Windows 更新以及任何可能给您带来线索的内容,直到您能够恢复它。

其他建议,尝试将 select 语句限制为 TOP 10,只是为了看看您是否能够返回结果,这可能表明问题在于对象的大小/查询执行时间,而不是您的服务器/应用程序配置。