代码之家  ›  专栏  ›  技术社区  ›  Sadegh

突然,Sql Server超时

  •  1
  • Sadegh  · 技术社区  · 16 年前

    我们得到了一个运行多年的遗留vb.net应用程序 但是昨天它突然停止工作,并导致sql server超时 应用程序的大部分都会出现超时错误,例如下面的代码:

    command2 = New SqlCommand("select * from Acc order by AccDate,AccNo,AccSeq", SBSConnection2)
            reader2 = command2.ExecuteReader()
        If reader2.HasRows() Then
            While reader2.Read()
                If IndiAccNo <> reader2("AccNo") Then
                    CAccNo = CAccNo + 1
                    CAccSeq = 10001
                    IndiAccNo = reader2("AccNo")
                Else
                    CAccSeq = CAccSeq + 1
               End If
                command3 = New SqlCommand("update Acc Set AccNo=@NewAccNo,AccSeq=@NewAccSeq where AccNo=@AccNo and AccSeq=@AccSeq", SBSConnection3)
                command3.Parameters.Add("@AccNo", SqlDbType.Int).Value = reader2("AccNo")
            command3.Parameters.Add("@AccSeq", SqlDbType.Int).Value = reader2("AccSeq")
              command3.Parameters.Add("@NewAccNo", SqlDbType.Int).Value = CAccNo
            command3.Parameters.Add("@NewAccSeq", SqlDbType.Int).Value = CAccSeq
    
          command3.ExecuteNonQuery()
        End While
    End If
    

    它正在工作,现在在command3.ExecuteNonQuery()中超时 有什么想法吗?

    ~~~~~~~~~~~

    主要的问题是,即使在开发环境中,它也不再有效

    13 回复  |  直到 16 年前
        1
  •  16
  •   Bob Jarvis - Слава Україні    16 年前

    我要说的是显而易见的——有些东西改变了。它可能是一个没有达到预期效果的升级-可能是一个网络组件正在南下-可能是一个片状磁盘-可能是很多东西-但是 某物 在中,访问路径已更改。您还看到了哪些其他问题迹象,包括与此应用程序不直接相关的问题?数据库存储在哪里(本地磁盘、网络存储盒、由angels写在pin头上的其他)?您的系统管理员是否以某种方式“帮助”或“改进”了一些事情?代码并没有失效——发生了其他事情。

        2
  •  15
  •   sgmoore    16 年前

    acc表中有多少条记录,AccNo和AccSeq上有索引吗?

        3
  •  10
  •   HLGEM    16 年前

    更新统计信息和重建索引有多久了?

    您的数据增长了多少?对于小数据集运行良好的查询对于大数据集可能不好。

    您是否遇到锁定问题[AMJ]您是否已检查“活动监视器”以查看超时时是否存在锁定?

    您是否运行了探查器来获取超时的查询,然后直接在服务器上运行它?那么快吗?在将信息从数据库服务器移动到应用程序时也可能存在网络问题。这至少可以告诉您这是SQl Server问题还是网络问题。

    正如Bob Jarvis所说,服务器最近发生了什么变化?数据库结构本身有什么变化吗?有人加了扳机吗?

        4
  •  3
  •   slugster Joey Cai    16 年前

    我知道这不是您问题的一部分,但在看到您的示例代码后,我必须做出以下评论:您是否有可能更改在数据库上执行sql的方法?这在很多方面都很糟糕。

        5
  •  1
  •   Will Marcouiller    16 年前

    也许你应该设定 CommandTimeout

    update .

    知道 SqlDataReader "SELECT" SqlCommand 需要,而不是超时。

        6
  •  1
  •   A.Rashad    16 年前

    是否有可能将“引号”作为传递给查询的字符串的一部分?

        7
  •  1
  •   Syd    16 年前

    你测试过明显的错误吗?

    您是否直接在SQL Server Management Studio上运行了“update Acc Set AccNo=@NewAccNo,AccSeq=@NewAccSeq其中AccNo=@AccNo和AccSeq=@AccSeq”查询(请用一些硬编码值替换变量)

    您是否在其他同事的电脑上运行了相同的测试?

        8
  •  0
  •   AhmedHuq    16 年前

        9
  •  0
  •   Anthony Faull    16 年前

    您可以将更新重写为单个查询。这将比原始查询运行得快得多。

    UPDATE subquery
    SET AccNo = NewAccNo, AccSeq = NewAccSeq
    FROM
        (SELECT AccNo, AccSeq, 
            DENSE_RANK() OVER (PARTITION BY AccNo ORDER BY AccNo) NewAccNo,
            ROW_NUMBER() OVER (PARTITION BY AccNo ORDER BY AccDate, AccSeq)
                + 10000 NewAccSeq
         FROM Acc) subquery
    
        10
  •  0
  •   AMissico    16 年前

    在HLGEM提出建议后,我会检查数据,确保数据是正确的。在这种情况下,95%的时间是数据。

        11
  •  0
  •   AMissico    16 年前

    确保磁盘已进行碎片整理。是的,我知道,但这确实有区别。不是内置的碎片整理程序。一个像这样进行碎片整理和优化的程序 PerfectDisk

        12
  •  0
  •   Paddy    16 年前

        13
  •  0
  •   loviji    16 年前

    SqlConnection.ConnectionTimeout 配置文件中的属性值很少。执行查询时不需要此值。