Як негайно вбити / зупинити довгий запит SQL?


93

Я використовую SQL Server 2008 та його студію управління. Я виконав запит, який дає багато рядків. Я намагався скасувати його за допомогою червоної кнопки скасування, але він не зупинявся протягом останніх 10 хвилин. Зазвичай це зупиняється протягом 3 хвилин.

У чому може бути причина і як це негайно зупинити?


ви перевіряли, що будь-яка програма містить цей запит ??
user1102001

1
зупиніть і перезапустіть свої служби sql ще раз ..
user1102001

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

@ user1102001 - нічого не змушуючи. Я сказав, що можна, а не слід :)
продовження. Навчання

Відповіді:


66

Що могло бути причиною

Скасування запиту відбувається негайно, за умови, що ваша увага може потрапити на сервер і бути обробленою. Запит повинен бути у стані скасування, що майже завжди відповідає дійсності, за винятком випадків, коли ви виконуєте певні операції, такі як виклик веб-служби з SQLCLR. Якщо ваша увага не може потрапити на сервер, як правило, через перевантаження планувальника .

Але якщо ваш запит є частиною транзакції, яка повинна відмовлятись, тоді відкат не можна перервати. Якщо це займає 10 хвилин, то потрібно 10 хвилин, і ви нічого з цим не зробите. Навіть перезапуск сервера не допоможе, лише зробить запуск довшим, оскільки відновлення повинно закінчити відкат.

Щоб відповісти, яка конкретна причина стосується вашої справи, вам доведеться провести розслідування.


Зверніть увагу, що SSMS відображає запит як "скасовано" (на відміну від "спроба скасувати") лише після отримання відповіді на увагу, що передбачає спочатку злив усіх проміжних результатів у каналі зв'язку (наприклад, усі результати в TCP / IP відправлені / отримані буфери та всі буфери в пам'яті).
Ремус Русану,

1
Я хотів би, щоб на ньому було сказано "відкат"
Simon_Weaver

@RemusRusanu - Що робити, якщо передбачуваний час відкоту становить 20 000+ годин? З радістю відновлення з резервної копії. dba.stackexchange.com/questions/222145/…
youcantryreachingme

108
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'.
Кодекс Бастер

40

Спочатку виконайте наведену нижче команду:

sp_who2

Після цього виконайте наведену нижче команду за допомогою SPID, яку ви отримали від верхньої команди:

KILL {SPID value}

22

Це якась безглузда відповідь, але вона надійно працює, принаймні в моєму випадку: в студії управління, коли "Скасувати виконання запиту" не зупиняє запит, я просто натискаю, щоб закрити поточний документ sql. він запитує мене, чи хочу я скасувати запит, я кажу так, і ось через кілька секунд він зупиняється. Після цього він запитує мене, чи хочу я зберегти документ перед закриттям. На цьому етапі я можу натиснути кнопку Скасувати, щоб документ залишався відкритим і продовжував працювати. Не уявляю, що відбувається за лаштунками, але, здається, це працює.


5
У цьому випадку запит, можливо, все ще працює / зависає у фоновому режимі, ви просто більше не бачитимете його.
Овен51

1
Я думаю, це вбиває зв’язок, оскільки після цього вам доведеться відновити зв’язок.
anakic

2
Це вбиває підключення до SSMS, але не (обов'язково) до db.
Овен51,

1
Я спробував цей мій sql повішений. T_T
бот

1
Якщо ви не можете його побачити, його не існує.
ChrisD

13

Якщо скасувати і побачити цей запуск

 sp_who2 'active'

(Монітор активності не буде доступний на старому сервері sql 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.

11

Ви можете використовувати комбінацію клавіш ALT+, Breakщоб зупинити виконання запиту. Однак це може вдатися не у всіх випадках.


1
Цей працював у мене в студії управління. Дякую
Vishvanathsinh Solanki

3
--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 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.