【问题标题】:Timeout expire on updating nvarchar(max)更新 nvarchar(max) 时超时
【发布时间】:2013-10-02 07:21:56
【问题描述】:

我有一个包含 nvarchar(Max) 字段的表,它包含大约 50,0000 个字符 每条记录。当我插入数据时,没关系,但是当我更新数据时 发生错误:“Timeout expired 在编译操作之前超时时间已过或服务器没有响应”

CREATE TABLE [dbo].[tblJudgementText]( [JudgementID] [int] NOT NULL, 
  [JudgementText] [nvarchar](max) NULL, 
  [Source] [nvarchar](500) NULL, 
  [UserID] [int] NULL, 
  [ModifiedDate] [datetime] NULL, 
  CONSTRAINT [PK_tblJudgementText] PRIMARY KEY CLUSTERED ( [JudgementID] ASC))

我也尝试将连接超时设置为 = 100

我尝试删除第一条记录并插入新记录的第二种方式,但删除记录它会引发相同的错误

【问题讨论】:

  • 你必须提供select语句,也许是一些表定义。
  • 可能需要更多时间,您可以增加超时时间。

标签: sql sql-server timeoutexception


【解决方案1】:

SQL Server 通常不会抛出超时错误。似乎错误是由客户端引发的,无论您使用什么客户端 API。一些客户端 API,例如。托管 SqlClient,将默认请求超时设置为 30 秒,请参阅 SqlCommand.CommandTimeout ,在此时间过后,它们中止请求。

事实上,您似乎遇到了性能问题,您的UPDATE 语句可能需要超过 30 秒。我们无法猜测问题是什么,只有您知道正在发生的事情。将此视为性能问题,阅读Waits and Queues 并尝试应用其方法。阅读Understanding how SQL Server executes a query 以了解要查找的内容。

我的体力告诉我,您的 UPDATE WHERE 子句包含导致扫描的non-sargable 条件。这要么阻止锁定,要么只是在 IO 上超时,即使我的精神力量也无法在没有任何信息的情况下解决这个问题......

发布准确的表定义、准确的 UPDATE 语句和 execution plan(XML!,不是图片)。

【讨论】:

    【解决方案2】:

    您是从 SQL Server 客户端更新还是以编程方式进行更新..? 在给出更新指令之前尝试给出'select .. for update'。

    如果没有其他约束,甚至可以考虑删除记录,作为新记录插入。

    【讨论】:

    • 使用存储过程更新我首先尝试删除记录并插入新记录,但删除它会引发同样的错误
    • 似乎您可能必须重写代码/查询,以便一次删除一条记录,然后进行插入。您可能会在单个查询中删除大量记录。如果您可以从存储过程中发布 sn-ps,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2021-06-26
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    相关资源
    最近更新 更多