2010-03-02 4 views
3

У меня есть таблица, которая всегда обновлялась раньше, но потом я уже не могу обновлять ни один из столбцов в таблице. я все еще могу запросить всю таблицу, и результаты вернутся очень быстро, но в тот момент, когда я пытаюсь обновить столбец в таблице, запрос обновления просто кивает и ничего не делает.Таблица сервера Sql может быть запрошена, но не обновлена ​​

я попытался с помощью

select req_transactionUOW 
from master..syslockinfo 
where req_spid = -2 

, чтобы увидеть, если какой-то осиротели сделка была блокировка таблицы, но не возвращает никаких результатов.

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

+0

Что происходит, когда вы пытаетесь его обновить? Является ли тайм-аут запроса или возвращает ошибку? – Justin

+0

время запроса – Nigel

ответ

0

Я предполагаю, что это не проблема, так как вы не получаете ошибку.

Так что, ближе всего к этому я был раньше, когда индексы на столе стали коррумпированными. Вы пытались сбросить индексы и воссоздать их? Сначала попробуйте по одному.

0

Не могли бы вы выдать этот запрос:

SELECT COUNT(*) 
FROM mytable WITH (UPDLOCK, READPAST) 

, которая пропустит заблокированные записи и убедитесь, что она возвращает то же число записей как

SELECT COUNT(*) 
FROM mytable 

Вам может понадобиться повторить с каждым индекс в таблице принудительно, чтобы убедиться, что ни один индекс не заблокирован.

+0

Я попробовал вам предоставленные вами запросы, а затем попробовал каждый с индексами по отдельности, и все они вернули одинаковое количество строк. – Nigel

+0

@Nigel: блокировка 'UPDATE' для любой записи или только для некоторых конкретных записей ? Блокирует ли он, когда вы пытаетесь обновить другие столбцы? – Quassnoi

+0

Я не могу обновить любую строку в любом столбце. запрос на обновление просто, кажется, хочет работать вечно, когда ему требуется всего лишь секундная смена – Nigel

0

Если вы подозреваете о блокировке, одной из первых вещей, которые я бы сделал, было бы запустить sp_lock. Он предоставит вам список всех текущих блокировок. Вы можете использовать функции DB_NAME и OBJECT_NAME, чтобы получить имена, соответствующие столбцам dbid и ObjId.

0

У вас есть триггеры на столе? Если это так, может случиться так, что триггер не работает, поэтому предотвращает обновление.

+0

nope, никаких триггеров – Nigel

1

Когда вы говорите «время ожидания», оно попадает в тайм-аут клиента? Например, время ожидания команды .net составляет 30 секунд. Я бы предложил увеличить это до очень большого значения или запустить обновление в SQL-инструментах (по умолчанию не установлен тайм-аут).

Кроме этого, обновление будет закончиться в какой-то момент или с ошибкой и откатом: вы оставляете достаточно времени?

Существует также блокировка, последнее обновление индекса, последнее обновление статистики, триггеры, случайное перекрестное соединение, рост файлов MDF или LDF, плохой ввод-вывод, пейджинг OS ... и т. Д. И вы перезапустили экземпляр SQL или сервер, чтобы удалить экологические проблемы и убить все другие соединения?

Просто не хватает информации, чтобы судить прямо сейчас извините.

0

Можете ли вы обновить другие таблицы? Если нет (или в любом случае, если хотите), вы можете проверить, заполнен ли журнал транзакций (если вы используете полную модель восстановления)/раздел, в котором находится ваш журнал транзакций, заполнен. Я думаю, что если SQL Server не сможет записать в журнал транзакций, вы могли бы/могли бы испытать это поведение.

DBCC будет вашим другом: DBCC SQLPERF(LOGSPACE) показывает, сколько (в процентах) вашего журнала используется. Если это (близко к) 100%, это может быть вашей проблемой.

Только мои две копейки стоит.

Смежные вопросы