2013-11-18 4 views
0

Я использую следующий код:Таймаут SQL Server Delete Command

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

ли запись с идентификатором 14 существует или нет, я получаю:

DELETE FROM таблицы WHERE ID = 14

Microsoft OLE DB Provider для ошибок SQL Server '80040e31'

тайм-аут запроса истекло

/index.asp, линия 58

Line 58 являются:

myConn.Execute(mySQLdel) 

Эквивалентная команда прекрасно работает над другим столом, поэтому я предполагаю, что это что-то делать с разрешениями, хотя не может для жизни меня что-то выяснить.

Когда я запускаю тот же SQL в SQL Management Studio, запрос выполняется почти мгновенно.

Вот создать сценарий, который был запрашиваемую ниже:

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 | | 
+----------------------+------------+-----------------+------------------+-----------+--------------------+-----------------------+---------------------+--------------------------+--------------------------------------------------------------------------------------------------+--+ 

Любые идеи?

спасибо.

+0

Это ваш точный запрос или вы используете параметризованные запросы? Если это не ваш точный запрос, отправьте фактический запрос и определение таблицы, включая индексы. –

+0

Это может показаться, что с помощью кувалды взломать гайку, но вы можете сделать команду delete в хранимой процедуре. Кроме того, вы пытались подключиться через Native Client, а не SQLOLEDB? http://www.connectionstrings.com/sql-server/ – John

+0

Редактировали, чтобы показать точный запрос. Как показать определение таблицы? Прямо щелкнув по таблице, а затем по свойствам, но не совсем уверен, что вам полезно там увидеть. – user2029763

ответ

2

Есть много вещей, которые могут заставить сервер sql занять больше времени, чем ожидалось. Когда вы делаете удаление, он может быть каскадом в другие таблицы, например. Вам нужно будет просто увеличить время ожидания команды перед ее выполнением.

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

Это не объясняет, почему «когда я запускаю тот же SQL в SQL Management Studio, запрос выполняется почти мгновенно». –

+0

Он также не упоминал, говорил ли он о местных и удаленной системе. Как я уже сказал, существует много вещей, которые могут привести к тому, что сервер sql займет больше времени, чем ожидалось, давление в памяти, давление и другие процессы, латентность сети и т. Д. – iamkrillin

+2

Ни одна из этих (за исключением, возможно, сетевой задержки) не объясняет различия между тот же запрос выполняется локально и удаленно. И сетевой трафик для типичной простой команды 'delete' будет минимальным. –

0

Хорошо ... Я должен унижаться ...

Что я делал звала запись из table1, а затем сделать что-то вроде:

if not myRS.eof then 
    delete from table1 
end if 

После того, как я изменил код, все хорошо ...