Тайм-аут оператора вставки SQL Server истек - PullRequest
19 голосов
/ 15 января 2009

У меня есть простая таблица с 6 столбцами. Большую часть времени любые операторы вставки в него работают просто отлично, но время от времени я получаю исключение DB Timeout: Тайм-аут истек. Время ожидания истекло до завершения операции или сервер не отвечает. Заявление было прекращено.

Время ожидания установлено на 10 секунд.

Я должен упомянуть, что я использую NHibernate и что этот оператор также включает "select SCOPE_IDENTITY ()" сразу после самой вставки.

Я думал, что таблица заблокирована или что-то в этом роде, но в то время на этой таблице не было никаких других операторов.

Все вставки очень просты, все выглядит нормально в sql profiler, таблица не имеет индексов, кроме PK (заполненность страницы: 98.57%).

Любые идеи о том, что я должен искать?

Спасибо.

Ответы [ 6 ]

31 голосов
/ 16 января 2009

Я думаю, что ваш наиболее вероятный виновник - блокировка блокировки от другой транзакции (или, возможно, от триггера или чего-то еще за кадром).

Самый простой способ определить это - запустить INSERT и, пока он завис, запустить EXEC SP_WHO2 в другом окне на том же сервере. Это будет перечислять все текущие действия базы данных, и имеет столбец с именем BLK, который покажет вам, если какие-либо процессы в настоящее время заблокированы. Проверьте SPID вашего зависшего соединения, чтобы увидеть, есть ли в нем что-то в столбце BLK, и если это так, то этот процесс блокирует вас.

Даже если вы не думаете, что выполняются какие-либо другие операторы, единственный способ узнать наверняка - перечислить текущие транзакции с использованием SP, подобного этому.

21 голосов
/ 11 ноября 2011

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

В приведенном ниже фрагменте используется соглашение, которое SP_WHO2 возвращает "." текст для BlockedBy для незаблокированных запросов, поэтому он отфильтровывает их и возвращает текст SQL оставшихся запросов (как «жертвы», так и «виновника»):

--prepare a table so that we can filter out sp_who2 results
DECLARE @who TABLE(BlockedId INT, 
                   Status VARCHAR(MAX), 
                   LOGIN VARCHAR(MAX), 
                   HostName VARCHAR(MAX), 
                   BlockedById VARCHAR(MAX), 
                   DBName VARCHAR(MAX), 
                   Command VARCHAR(MAX), 
                   CPUTime INT, 
                   DiskIO INT, 
                   LastBatch VARCHAR(MAX), 
                   ProgramName VARCHAR(MAX), 
                   SPID_1 INT, 
                   REQUESTID INT)
INSERT INTO @who EXEC sp_who2

--select the blocked and blocking queries (if any) as SQL text
SELECT 
(
    SELECT TEXT 
    FROM sys.dm_exec_sql_text(
       (SELECT handle 
        FROM (
            SELECT CAST(sql_handle AS VARBINARY(128)) AS handle
            FROM sys.sysprocesses WHERE spid = BlockedId
        ) query)
    )
) AS 'Blocked Query (Victim)',
(
    SELECT TEXT 
    FROM sys.dm_exec_sql_text(
       (SELECT handle 
        FROM (
            SELECT CAST(sql_handle AS VARBINARY(128)) AS handle
            FROM sys.sysprocesses WHERE spid = BlockedById
        ) query)
    )
) AS 'Blocking Query (Culprit)'
FROM @who 
WHERE BlockedById != '  .'
5 голосов
/ 16 января 2009

Возможно, столу требуется много времени для роста.

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

Проверьте этот беспорядок: MSDN

4 голосов
/ 15 января 2009

в то время в этой таблице не выполнялось никаких других операторов.

Как насчет операторов, работающих с другими таблицами как часть транзакции? Это может оставить замки на проблемной таблице.

Также проверьте, происходит ли рост файла журнала или файла данных в то время, если вы используете SQL2005, он будет отображаться в журналах ошибок SQL.

3 голосов
/ 19 января 2009

В нашем QA было несколько соединений с Excel, которые возвращали большие наборы результатов, эти запросы на некоторое время были приостановлены с помощью WaitType из ASYNC_NETWORK_IO. В течение этого времени все другие запросы были заблокированы, поэтому конкретная вставка не имела к этому никакого отношения.

0 голосов
/ 15 января 2009

посмотрите на фрагментацию таблицы, из-за этого вы можете получить разбиение страницы

...