【问题标题】:Timeout on SQL Server Delete CommandSQL Server 删除命令超时
【发布时间】:2013-11-18 14:00:13
【问题描述】:

我正在使用以下代码:

'item being 14
mySQLdel = "DELETE FROM table WHERE ID= " & item
response.write "<p>SQL Command: " & mySQLdel & "</p>"
myConn.Execute(mySQLdel)

id 为 14 的记录是否存在,我得到:

从 ID=14 的表中删除

Microsoft OLE DB Provider for SQL Server 错误“80040e31”

查询超时

/index.asp,第 58 行

第 58 行是:

myConn.Execute(mySQLdel)

等效的命令可以在另一个表上正常工作,所以我认为它与权限有关,尽管我一生都无法弄清楚是什么。

当我在 SQL Management Studio 中运行相同的 SQL 时,查询几乎立即执行。

这是下面请求的创建脚本:

USE [user1]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[tablename](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [var1] [nvarchar](max) NULL,
    [var2] [int] NULL,
    [var3] [int] NULL,
    [var4] [nvarchar](50) NULL,
    [datecreated] [datetime] NULL
) ON [PRIMARY]

GO

sys.dm_os_waiting_tasks 显示

+----------------------+------------+-----------------+------------------+-----------+--------------------+-----------------------+---------------------+--------------------------+--------------------------------------------------------------------------------------------------+--+
| waiting_task_address | session_id | exec_context_id | wait_duration_ms | wait_type | resou‌​rce_address | blocking_task_address | blocking_session_id | blocking_exec_context_id |                                      re‌​source_description                                      |  |
+----------------------+------------+-----------------+------------------+-----------+--------------------+-----------------------+---------------------+--------------------------+--------------------------------------------------------------------------------------------------+--+
| 0x00000000041F7288   |         63 |               0 |             7139 | LCK_M_U   | 0x00000000869F2C40 | NULL                  |                  69 | NULL                     | ridlock fileid=1 pageid=214 dbid=61 id=lock847e0b00 mode=U associatedObjectId=72057594039435264  |  |
+----------------------+------------+-----------------+------------------+-----------+--------------------+-----------------------+---------------------+--------------------------+--------------------------------------------------------------------------------------------------+--+

有什么想法吗?

谢谢。

【问题讨论】:

  • 这是您的确切查询还是您使用的是参数化查询?如果不是您的确切查询,请发布实际查询和包含索引的表定义。
  • 这看起来像是用大锤敲碎了坚果,但是你能不能把你的删除命令变成一个存储过程。另外,您是否尝试过通过 Native Client 而不是 SQLOLEDB 进行连接? connectionstrings.com/sql-server
  • 桌面上有触发器吗?当 Web 应用查询运行时,SELECT * FROM sys.dm_os_waiting_tasks WHERE session_id &gt; 50 是否返回任何内容?
  • 很难知道为什么相同的查询会被 Web 应用程序阻止,而不是 SSMS。桌子上有触发器吗?如果不是,我假设必须是不同的执行计划。表上有哪些索引?它是否被任何外键引用?
  • 还有什么是session_id = 69?看起来它可能是一个空闲的未提交事务。这不是你的 SSMS 窗口吗?

标签: sql sql-server asp-classic


【解决方案1】:

有很多事情会导致 sql server 花费比预期更长的时间来做某事。例如,当您进行删除时,它可能会级联到其他表中。您需要做的只是在执行命令之前增加命令的超时时间。

SqlCommand cmd = new SqlCommand();
cmd.CommandTimeout = 0; //no timeout
cmd.CommandText = "delete from foo;";

【讨论】:

  • 这并不能解释为什么“当我在 SQL Management Studio 中运行相同的 SQL 时,查询几乎立即执行。”
  • 他也没有提到他是在谈论本地系统还是远程系统。就像我说的,有很多很多事情会导致sql server比预期花费更长的时间,内存压力,io压力,其他进程,网络延迟等等。
  • 这些(除了可能的网络延迟)都不能解释本地和远程执行的相同查询之间的差异。典型的简单delete 命令的网络流量将是最小的。
  • 数据库和网络服务器在同一台服务器上。我正在浏览器中本地查看。
  • @user2029763 - 您是否发现这是始终可重复的?在 SSMS 中它会立即运行,而在 Web 应用程序中它会超时?
【解决方案2】:

好吧...我必须吃不起眼的馅饼...

我正在做的是从 table1 中调用一条记录,然后执行以下操作:

if not myRS.eof then
    delete from table1
end if

一旦我更改了代码,一切都很好......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    相关资源
    最近更新 更多