SQL Server 2008 - время ожидания запроса на обновление - PullRequest
0 голосов
/ 20 сентября 2010

Я использую SQL2008 и .NET 4.

Следующий запрос UPDATE вызывает ошибки тайм-аута.

Таблица Страницы имеет 600 000 записей.

Ошибка:

System.Data.SqlClient.SqlException (0x80131904): истекло время ожидания. тайм-аут истек до завершение операции или Сервер не отвечает.

Запрос:

UPDATE  Pages
SET Checked = 1  , LastChecked = GETDATE()
OUTPUT Inserted.ID, Inserted.Title INTO @Updated
WHERE ID in 
 (SELECT TOP (@Count) ID 
  FROM Pages 
  WHERE Checked = 0 and FileID = @FileID 
  ORDER BY ID)

SELECT * FROM @Updated  
END

В другом потоке я вставляю записи в таблицу Pages, это выполняется постоянно (страница добавляется каждые 1 секунду или меньше).

INSERT INTO Pages (Title ,.......)
VALUES (@Title , .......)

Почему я получаю ошибку тайм-аута и как я могу ее исправить?

Разве SQL не ждет бесконечно в ситуации блокировки?

Ответы [ 2 ]

2 голосов
/ 20 сентября 2010

Тайм-аут вашей команды / клиента, а не самого SQL Server.

Возможно, установите для SqlCommand.CommandTimeout более высокое значение?

 myCmd.CommandTimeout = 360; //seconds

Обновления:

Вы уверены, что ваша 1-секундная инструкция UPDATE заблокирована / заблокирована?Возможно, есть что-то еще, исполняющее только что предыдущее?

Вы смотрели на SSMS, чтобы определить, что блокируется / блокируется?Щелкните правой кнопкой мыши по вашему серверу, выберите «Монитор активности».alt text

Что показывает SQL Profiler как выполняемый?

0 голосов
/ 20 сентября 2010

Как сказал (+1) p.campbell, время ожидания исходит от .NET, а не от SQL.

Какая у вас индексация?Без подходящего покрытия столбцов «Checked» и / или «ID» ваш подзапрос (SELECT TOP ...) должен будет прочитать каждую страницу в таблице, чтобы сначала получить все, где Checked = 0, а затем отсортировать их по ID.Если он большой и регулярно обновляется, это может сделать его Delay Central.

Если они не должны быть упорядочены по Id, удаление ORDER BY может привести к тому, что запрос будет читать только строки, пока не получит @Countиз них.

Если у вас SQL 2008, фильтрованный запрос (... WHERE Checked = 0) может ускорить процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...