2012-04-17 2 views
0

у меня есть это очень простой запрос в моей базе данных в SQL Server 2008 R2:SQL Server 2008 - UPDATE никогда не закончить

UPDATE Table1 
    SET Field1 = 'This value' 
WHERE ID  = '12345' 

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

Мне нужно выполнить этот запрос программно. У меня есть все необходимое для его выполнения, но единственная проблема в том, что он дает мне сообщение об ошибке «Тайм-аут». Я попытался увеличить свой CommandTimeOut, но при этом будет удерживать программу в течение более длительного времени. (Поскольку выполнение запроса в SQL Server действительно занимает много времени, см. Мой сценарий раньше)

Может ли кто-нибудь указать мне хорошее решение, чтобы избежать этой проблемы? И да, таблица, к которой я обращаюсь, имеет множество записей, таких как тысячи. Это никогда не было проблемой раньше, но теперь это так. :(

Заранее спасибо :)

+0

Два вопроса: (1) есть ли индекс ** в столбце 'ID'? И (2) - какой тип данных является «ID» ?? Если это числовой тип данных, вы не должны использовать строку для указания своего идентификатора - вместо этого используйте 'WHERE ID = 12345' (без кавычек). И PS: * тыс. * Строк ** НИЧЕГО ** - если мы говорим несколько сотен миллионов - тогда у нас есть «лоты» .... –

+0

Сколько строк вы ожидаете изменить? Вы посмотрели на профилировщик SQL? Выполняли ли вы похожие запросы ('где id = '23456'')? – hkf

+1

«много записей, таких как тысячи». Это очень небольшое количество строк. Чтобы представить это в перспективе, 100 миллионов достаточно велики. –

ответ

4

Похоже, вы оставили открытую сделку, которая заперта строка с ID 12345. Команда будет никогда закончить, пока вы не зафиксируете или откат этой транзакции.

Открыть Activity Monitor и посмотреть, какая транзакция блокирует ваше обновление. Затем найдите окно SSMS, оставшееся незанятым, из которого вы выполнили эту транзакцию, и совершите или откат.

Для получения более подробной информации см. Understanding and resolving SQL Server blocking problems. Для общей методологии устранения неполадок см. Waits and Queues.

+1

+1. Отличная психическая отладка! –

+0

+100000. Это то, что мне нужно. По-видимому, несколько других операторов SELECT заперли одну и ту же строку. Большое спасибо! Это напомнило мне ключевое слово WITH (NOLOCK). – Smiley