【发布时间】:2014-08-13 20:43:09
【问题描述】:
我有一个DELETE 命令,当我从我的应用程序运行它时会超时。为了进行调查,我在 SQL Server Management Studio 中放置了相同的命令并立即执行。谁能指出我正确的方向以找到延迟的原因?
在 SQL Server Management Studio 中,我输入了:
DECLARE @docid INT;
SET @docid = 41;
DELETE FROM reports WHERE doc_id=@docid;
reports 表只有 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, TaskCompletionSource1 完成,Int32 超时,Task& 任务, 布尔 asyncWrite) 在 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 完成,字符串方法名,布尔型 sendToPipe,Int32 超时, 布尔 asyncWrite) 在 System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
【问题讨论】:
-
“报告”表上是否有任何触发器或级联关系?
-
可能是死锁或循环引用?
-
您的程序中是否有多个连接,而另一个可能从表中读取数据?
-
尝试
SELECT * FROM SYS.SYSPROCESSES看看是否有任何被阻止(当您的应用正在删除时)?如果是这样,您可以通过执行DBCC INPUTBUFFER(##)来获得代码阻塞,其中 ## 是阻塞连接的 SPID。 -
您使用的是什么版本的 SQL Server 和 SSMS? SSMS 2008 及更高版本,右键单击您的连接并选择“活动监视器”。任何打开的连接以及它们所处的状态都将在此处列出。执行查询时,如果它被阻塞,它将引用另一个连接。
标签: c# sql-server