Получение информации о выполнении запроса на обновление - PullRequest
3 голосов
/ 02 февраля 2010

На Sql Server 2008 у меня медленный запрос на обновление, который работал в течение 3 часов. Есть ли способ получить какую-либо статистику (скажем, сколько строк изменилось до сих пор или что-то еще) об этом выполнении (конечно, во время выполнения)? Чтобы я мог принять решение между отменой запроса и его оптимизацией или дать ему закончить.

Или еще, я должен был что-то сделать перед казнью? Если это так, что можно сделать перед выполнением для получения информации о запросе на обновление во время его выполнения. (конечно, без существенного влияния на производительность)

обновление для уточнения:
упомянутое в вопросе заявление об обновлении (например,):
ОБНОВЛЕНИЕ myTable SET col_A = 'значение1' ГДЕ col_B = 'значение2'
Другими словами, это одиночный запрос, который обновляет всю таблицу

Ответы [ 4 ]

3 голосов
/ 02 февраля 2010

Что вы можете сделать сейчас?

Вы можете попробовать выполнить отдельный запрос, используя табличную подсказку WITH (NOLOCK) , чтобы увидеть, сколько строк было обновлено. например если оператор обновления:

UPDATE MyTable
SET MyField = 'UPDATEDVALUE'
WHERE ID BETWEEN 1 AND 10000000

Вы можете запустить это:

SELECT COUNT(*)
FROM MyTable WITH (NOLOCK)
WHERE ID BETWEEN 1 AND 10000000
    AND MyField = 'UPDATEDVALUE'


Что вы можете сделать в будущем?

Вы можете выполнить обновление в пакетном режиме и выводить прогресс по мере его поступления. например используйте цикл для обновления записей, скажем, 1000 (произвольное значение для объяснения). После завершения каждого блока обновления распечатайте ход выполнения (при условии, что вы запускаете его из SSMS), например,

DECLARE @RowCount INTEGER
SET @RowCount = 1
DECLARE @Message VARCHAR(500)
DECLARE @TotalRowsUpdated INTEGER
SET @TotalRowsUpdated = 0

WHILE (@RowCount > 0)
    BEGIN
         UPDATE TOP (1000) MyTable
         SET MyField = 'UPDATEDVALUE'
         WHERE ID BETWEEN 1 AND 10000000
              AND MyField <> 'UPDATEDVALUE'

         SELECT @RowCount = @@ROWCOUNT
         SET @TotalRowsUpdated = @TotalRowsUpdated + @RowCount
         SELECT @Message = CAST(GETDATE() AS VARCHAR) + ' : ' + CAST(@TotalRowsUpdated AS VARCHAR) + ' records updated in total'
         RAISERROR (@Message, 0, 1) WITH NOWAIT
    END

Использование RAISERROR таким образом обеспечивает немедленную распечатку сообщений о ходе выполнения. Если вместо этого вы использовали PRINT, сообщения помещаются в буфер и не выводятся сразу, поэтому вы не сможете увидеть прогресс в реальном времени.

1 голос
/ 02 февраля 2010

С http://www.sqlnewsgroups.net/group/microsoft.public.sqlserver.server/topic19776.aspx

"Вы должны быть в состоянии выполнить грязное чтение, чтобы получить количество строк удовлетворяет условию обновления (при условии, что это значение еще не использовалось). "

Если вы установите в своем запросе «READ UNCOMMITTED», вы сможете увидеть строки, которые были обновлены вашим оператором, с помощью оператора select с соответствующими критериями. Я не специалист по этому вопросу ... так что я просто думаю.

0 голосов
/ 02 февраля 2010

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

0 голосов
/ 02 февраля 2010

Было бы очень полезно, если бы вы разместили запрос, чтобы мы могли посмотреть на него и попытаться помочь вам. Один из способов увидеть, что происходит, - использовать SQL Profiler для профилирования обновлений / вставок.

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