DELETE命令超时

时间:2014-08-13 20:43:10

标签: c# sql-server

我有一个DELETE命令,当我从我的应用程序运行它时超时。为了调查我在SQL Server Management Studio中放置了相同的命令并立即执行。任何人都可以指出我正确的方向找到延迟的原因吗?

在SQL Server Management Studio中输入:

DECLARE @docid INT;
SET @docid = 41;
DELETE FROM reports WHERE doc_id=@docid;

报告表只有5行,其中1行的docid为41.

报告表非常简单:

CREATE TABLE [dbo].[reports](
    [doc_id] [int] NULL,
    [candidate_id] [int] NULL,
    [report] [varbinary](max) NOT NULL,
    [ext] [nvarchar](10) NULL

对两个ID都有一些限制。

更多信息:

  • 如果我从同一个地方的其他桌子上删除它会很开心。
  • 连接是指同一台计算机上的本地实例。

这是我在应用程序中执行时遇到的异常:

  

{System.Data.SqlClient.SqlException(0x80131904):超时已过期。   在完成操作或之前经过的超时时间   服务器没有响应。 ---> System.ComponentModel.Win32Exception   (0x80004005):等待操作超时   System.Data.SqlClient.SqlConnection.OnError(SqlException异常,   Boolean breakConnection,Action 1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource 1完成,Int32超时,Task&任务,   布尔asyncWrite)at   System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1   completion,String methodName,Boolean sendToPipe,Int32 timeout,   布尔asyncWrite)at   System.Data.SqlClient.SqlCommand.ExecuteNonQuery()

2 个答案:

答案 0 :(得分:3)

您可以运行此查看以查看所有正在运行的查询(以及正在运行的代码)以及阻止spid详细信息...一旦确定了罪魁祸首,就可以从那里开始。

当您的应用超时时,您需要运行此功能才能正确获取信息。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
IF OBJECT_ID('TEMPDB..#SPID') IS NOT NULL DROP TABLE #SPID
DECLARE @InputBuffer TABLE (
        ID INT IDENTITY(1,1) PRIMARY KEY,
        SPID INT,
        BLOCKED INT,
        CPU BIGINT,
        PHYSICAL_IO BIGINT,
        EventType [nvarchar](1024),
        Parameter [int],
        EventInfo [nvarchar](MAX)
    )

DECLARE @SPID INT, @ID INT, @CPU BIGINT, @IO BIGINT, @BLOCKED INT

select spid, blocked, SUM(cpu) as cpu, SUM(physical_io) as physical_io
INTO #SPID
from sys.sysprocesses
where  status<>'sleeping'
group by spid, blocked

DECLARE SPID CURSOR LOCAL
FOR 
SELECT SPID, BLOCKED, CPU, PHYSICAL_IO FROM #SPID
OPEN SPID
FETCH NEXT FROM SPID INTO @SPID, @BLOCKED, @CPU, @IO
WHILE @@FETCH_STATUS=0
BEGIN
    INSERT INTO @InputBuffer (EventType, Parameter, EventInfo) EXEC('DBCC INPUTBUFFER('+@SPID +')')
    SET @ID = SCOPE_IDENTITY()
    UPDATE @InputBuffer SET SPID = @SPID, BLOCKED=@BLOCKED, CPU = @CPU, PHYSICAL_IO = @IO WHERE ID = @ID
    FETCH NEXT FROM SPID INTO @SPID, @BLOCKED, @CPU, @IO
END
CLOSE SPID
DEALLOCATE SPID

UPDATE @InputBuffer SET EventInfo = REPLACE(EventInfo,'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED','')
DELETE FROM @InputBuffer WHERE EventInfo='sys.sp_reset_connection;1' or EventInfo is null
SELECT * FROM @InputBuffer ORDER BY PHYSICAL_IO desc

答案 1 :(得分:0)

我不太确定,但是当桌子被锁定时会发生这种情况。检查特定的表是否已死锁。