Как немедленно убить / остановить длинный SQL-запрос?


96

Я использую SQL Server 2008 и его студию управления. Я выполнил запрос, который дал много строк. Я попытался отменить его с помощью красной кнопки отмены, но он не останавливался последние 10 минут. Обычно он прекращается в течение 3 минут.

В чем может быть причина и как мне немедленно ее остановить?


Вы проверили, что какое-либо приложение выполняет этот запрос ??
user1102001

1
остановите и снова перезапустите службы sql ..
user1102001

Я столкнулся с этим сенарио, поскольку даже я запускал все в sql, и я хочу редактировать свой профиль или нет ...
user1102001

@ user1102001 - ни к чему вас не принуждаю. Я сказал, может, а не должен :)
sequel.learner

Ответы:


65

В чем может быть причина

Отмена запроса происходит немедленно, при условии, что ваше внимание может достигнуть сервера и быть обработано. Запрос должен находиться в состоянии отмены, что почти всегда верно, за исключением случаев, когда вы выполняете определенные операции, такие как вызов веб-службы из SQLCLR. Если ваше внимание не может добраться до сервера, это обычно связано с перегрузкой планировщика .

Но если ваш запрос является частью транзакции, которую необходимо откатить, откат нельзя прервать. Если это занимает 10 минут, значит, нужно 10 минут, и вы ничего не можете с этим поделать. Даже перезапуск сервера не поможет, это только увеличит время запуска, поскольку восстановление должно завершить откат.

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


Обратите внимание, что SSMS показывает запрос как «отмененный» (в отличие от «попытки отменить») только после получения ответа «внимание», что подразумевает сначала удаление всех промежуточных результатов в канале связи (например, всех результатов в TCP / IP буферы отправки / получения и все буферы в памяти).
Ремус Русану

1
Я бы хотел, чтобы там было сказано «откат назад»
Simon_Weaver 01

@RemusRusanu - Что, если расчетное время отката составляет 20 000+ часов? С радостью восстановлю из резервной копии. dba.stackexchange.com/questions/222145/…
youcantryreachingme

110
sp_who2 'active'

Проверьте значения в CPUTime и DiskIO . Обратите внимание на SPID процесса, имеющего сравнительно большое значение.

kill {SPID value}

Я использую Microsoft SQL Server 2008 R2, я попытался выяснить, каков SPID запроса, который выполняется и приостановлен, и обнаружил, что существует множество экземпляров одного и того же SELECT SQL с одинаковым SPID. Когда я пытаюсь выполнить команду KILL 114, здесь 114 - это значение SPID моего приостановленного запроса. Я получаю сообщение об ошибке ниже: Пожалуйста, помогите. Сообщение 102, уровень 15, состояние 1, строка 2 Неправильный синтаксис рядом с '114'.
Code Buster

42

Сначала выполните следующую команду:

sp_who2

После этого выполните следующую команду с SPID, которую вы получили от команды выше:

KILL {SPID value}

23

Это своего рода глупый ответ, но он работает надежно, по крайней мере, в моем случае: в студии управления, когда «Отменить выполнение запроса» не останавливает запрос, я просто щелкаю, чтобы закрыть текущий документ sql. он спрашивает меня, хочу ли я отменить запрос, я говорю «да», и вот через несколько секунд он перестает выполняться. После этого меня спрашивают, хочу ли я сохранить документ перед закрытием. На этом этапе я могу нажать кнопку «Отмена», чтобы оставить документ открытым и продолжить работу. Понятия не имею, что происходит за кулисами, но вроде работает.


5
В этом случае запрос может все еще работать / зависать в фоновом режиме, вы просто его больше не увидите.
Aries51

1
Я думаю, что это убивает соединение, так как после этого вам все же придется переподключаться.
Anakic

2
Он убивает соединение с SSMS, но не (обязательно) с db.
Aries51

1
Я попробовал это, мой sql повесил трубку. T_T
бот

1
Если вы этого не видите, значит, его не существует.
ChrisD

14

Если вы отмените и увидите этот запуск

 sp_who2 'active'

(Монитор активности не будет доступен на старом sql server 2000 FYI)

Найдите SPID, который хотите убить, например, 81

Kill 81

Запустите sp_who2 'active' снова, и вы, вероятно, заметите, что он спит ... откатывается

Чтобы снова получить СТАТУС, убейте

Kill 81 

Тогда вы получите такое сообщение

 SPID 81: transaction rollback in progress. Estimated rollback completion: 63%. Estimated time remaining: 992 seconds.

Мне пришлось бежать, KILL {spid} WITH STATUSONLYчтобы увидеть статусное сообщение.
Руди

11

Вы можете использовать сочетание клавиш ALT+, Breakчтобы остановить выполнение запроса. Однако не во всех случаях это удается.


1
Этот у меня работал в студии менеджмента. Спасибо
Вишванатсин Соланки

5
--Find Session Id for respective all running queries
SELECT text, getdate(),*
 FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text(sql_handle)

---Kill specific session
kill 125

1
Пожалуйста, добавьте пояснения к своему ответу, отредактировав его, чтобы другие могли извлечь из него уроки
Нико Хаасе,

2

очевидно, на sql server 2008 r2 64bit, с длительным запросом из IIS, kill spid, похоже, не работает, запрос просто перезапускается снова и снова. и, похоже, он повторно использует spid. запрос приводит к тому, что sql-сервер постоянно занимает около 35% процессора и зависает на веб-сайте. Я предполагаю, что bc / он не может ответить на другие запросы для входа в систему


2
Я бы хотел увидеть источник для этого.
Ant Swift

1

В моей части мой sql завис, когда я пытался закрыть его во время бесконечной работы. Итак, я открыл диспетчер задач и завершил задачу своим sql-запросом. Это остановило мой sql и перезапустило его.


1

Простой ответ, если красное поле «стоп» не работает, это попробовать нажать кнопки «Ctrl + Break» на клавиатуре.

Если вы используете SQL Server в Linux, есть приложение, которое вы можете добавить в свою системную панель, под названием «killall». Просто нажмите кнопку «killall», а затем щелкните программу, которая попала в цикл, и она завершит выполнение программы. Надеюсь, это поможет.


1

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

Но раз уж я пытался найти решение. Работал только 1 непрофессиональный подход

  • Нажмите кнопку закрытия над вкладкой запроса, по которому вы страдаете. Через некоторое время (если Microsoft не относится к вам сурово !!!) вы можете получить окно с вопросом об этом.

«Запрос в настоящее время выполняется. Вы хотите отменить запрос?»

  • Нажмите "Да"

  • Через некоторое время он спросит, хотите ли вы сохранить этот запрос или нет?

  • Нажмите "Отмена"

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

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

PS: Это работает для меня, Престижность, если работает и для вас. !!!


1
Все еще работал у меня и решил мою проблему ->
ErocM
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.