Comment tuer / arrêter une longue requête SQL immédiatement?


93

J'utilise SQL Server 2008 et son studio de gestion. J'ai exécuté une requête qui produit de nombreuses lignes. J'ai essayé de l'annuler via le bouton rouge d'annulation, mais cela ne s'est pas arrêté au cours des 10 dernières minutes. Il s'arrête généralement dans les 3 minutes.

Quelle pourrait être la raison et comment puis-je l'arrêter immédiatement?


avez-vous vérifié qu'une application contient cette requête?
user1102001

1
arrêtez et redémarrez vos services SQL à nouveau ..
user1102001

J'ai fait face à ce senario car même j'exécutais tout en SQL et c'est mon souhait de modifier mon proflie ou pas ...
user1102001

@ user1102001 - ne vous oblige à rien. J'ai dit que je pouvais et ne devrais pas :)
sequel.learner

Réponses:


66

Quelle pourrait la raison

Une annulation de requête est immédiate, à condition que votre attention puisse atteindre le serveur et être traitée. Une requête doit être dans un état annulable, ce qui est presque toujours vrai, sauf si vous effectuez certaines opérations telles que l'appel d'un service Web à partir de SQLCLR. Si votre attention ne peut pas atteindre le serveur, cela est généralement dû à une surcharge du planificateur .

Mais si votre requête fait partie d'une transaction qui doit être restaurée, la restauration ne peut pas être interrompue. Si cela prend 10 minutes, cela prend 10 minutes et vous ne pouvez rien y faire. Même le redémarrage du serveur n'aidera pas, ne fera que prolonger le démarrage car la récupération doit terminer la restauration.

Pour savoir quelle raison spécifique s'applique à votre cas, vous devrez vous enquêter vous-même.


Notez que SSMS affiche la requête comme `` annulée '' (par opposition à `` tenter d'annuler '') uniquement après la réception de la réponse d'attention, ce qui implique de drainer d'abord tous les résultats intermédiaires dans le canal de communication (par exemple, tous les résultats dans le TCP / IP tampons d'envoi / réception et tous les tampons en mémoire).
Remus Rusanu

1
J'aimerais qu'il dise `` revenir en arrière ''
Simon_Weaver

@RemusRusanu - Que faire si le temps de retour estimé est de plus de 20000 heures? Heureux de restaurer à partir d'une sauvegarde. dba.stackexchange.com/questions/222145/…
youcantryreachingme

108
sp_who2 'active'

Vérifiez les valeurs sous CPUTime et DiskIO . Notez le SPID du processus ayant une grande valeur comparativement.

kill {SPID value}

J'utilise Microsoft SQL Server 2008 R2, j'ai essayé de savoir quel est le SPID de la requête en cours d'exécution et suspendue, et j'ai trouvé qu'il existe de nombreuses instances du même SELECT SQL ayant le même SPID. Lorsque j'essaye d'exécuter la commande KILL 114 - ici 114 est la valeur SPID de ma requête suspendue. J'obtiens l'erreur ci-dessous: Veuillez guider. Msg 102, niveau 15, état 1, ligne 2 Syntaxe incorrecte près de «114».
Code Buster

40

Exécutez d'abord la commande ci-dessous:

sp_who2

Après cela, exécutez la commande ci-dessous avec SPID, que vous avez obtenue à partir de la commande ci-dessus:

KILL {SPID value}

22

C'est un peu une réponse idiote, mais cela fonctionne de manière fiable au moins dans mon cas: dans le studio de gestion, lorsque "Annuler l'exécution de la requête" n'arrête pas la requête, je clique simplement pour fermer le document SQL actuel. il me demande si je veux annuler la requête, je dis oui, et voilà dans quelques secondes, il s'arrête de s'exécuter. Après cela, il me demande si je veux enregistrer le document avant de le fermer. À ce stade, je peux cliquer sur Annuler pour garder le document ouvert et continuer à travailler. Aucune idée de ce qui se passe dans les coulisses, mais cela semble fonctionner.


5
Dans ce cas, la requête est peut-être toujours en cours d'exécution / suspendue en arrière-plan, vous ne la verrez plus.
Aries51

1
Je pense que cela tue la connexion, car vous devez vous reconnecter après cela.
anakic

2
Il tue la connexion à SSMS mais pas (nécessairement) à la base de données.
Aries51

1
J'ai essayé ceci mon sql a raccroché. T_T
bot

1
Si vous ne pouvez pas le voir, cela n'existe pas.
ChrisD

13

Si vous annulez et voyez cette course

 sp_who2 'active'

(Activity Monitor ne sera pas disponible sur l'ancien serveur SQL 2000 FYI)

Repérez le SPID que vous souhaitez tuer par exemple 81

Kill 81

Exécutez à sp_who2 'active' nouveau et vous remarquerez probablement qu'il dort ...

Pour obtenir le STATUS, lancez à nouveau le KILL

Kill 81 

Ensuite, vous recevrez un message comme celui-ci

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

11

Vous pouvez utiliser un raccourci clavier ALT+ Breakpour arrêter l'exécution de la requête. Cependant, cela peut ne pas réussir dans tous les cas.


1
Celui-ci est travaillé pour moi dans le studio de gestion. Merci
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

Veuillez ajouter une explication à votre réponse en la modifiant de manière à ce que d'autres puissent en tirer des leçons
Nico Haase

2

apparemment sur sql server 2008 r2 64bit, avec une longue requête d'IIS, le kill spid ne semble pas fonctionner, la requête est juste redémarrée encore et encore. et il semble réutiliser le spid. la requête fait que le serveur sql prend constamment 35% du processeur et bloque le site Web. Je suppose que bc / il ne peut pas répondre à d'autres requêtes pour se connecter


2
J'adorerais voir une source pour cela.
Ant Swift

1

Pour ma part, mon sql s'est raccroché lorsque j'ai essayé de le fermer en courant sans fin. Donc, ce que j'ai fait est d'ouvrir mon gestionnaire de tâches et de terminer la tâche ma requête SQL. Cela a arrêté mon sql et l'a redémarré.


1

Une réponse simple, si la case rouge "stop" ne fonctionne pas, est d'essayer d'appuyer sur les boutons "Ctrl + Pause" du clavier.

Si vous exécutez SQL Server sur Linux, il existe une application que vous pouvez ajouter à votre barre d'état système appelée "killall". Cliquez simplement sur le bouton "killall", puis cliquez sur le programme qui est pris dans une boucle et cela mettra fin au programme. J'espère que cela pourra aider.


1

Je souffre de la même chose depuis longtemps. Cela se produit particulièrement lorsque vous êtes connecté à un serveur distant (ce qui peut être lent) ou que vous avez une mauvaise connexion réseau. Je doute que Microsoft sache quelle est la bonne réponse.

Mais depuis que j'ai essayé de trouver la solution. Une seule approche profane a fonctionné

  • Cliquez sur le bouton de fermeture sur l'onglet de la requête dont vous souffrez. Après un certain temps (si Microsoft n'est pas sévère avec vous !!!), vous pourriez avoir une fenêtre demandant ceci

"La requête est en cours d'exécution. Voulez-vous annuler la requête?"

  • Cliquez sur "Oui"

  • Après un certain temps, il vous demandera si vous souhaitez enregistrer cette requête ou non?

  • Cliquez sur "Annuler"

Et postez cela, peut-être que votre studio est à nouveau stable pour exécuter votre requête.

Ce qu'il fait en arrière-plan déconnecte votre fenêtre de requête avec la connexion. Donc, pour réexécuter la requête, il faudra du temps pour connecter à nouveau le serveur distant. Mais croyez-moi, ce compromis est bien meilleur que la souffrance de voir cette minuterie qui court pour l'éternité.

PS: Cela fonctionne pour moi, félicitations si cela fonctionne aussi pour vous. !!!


1
A toujours travaillé pour moi et a résolu mon problème à partir de ->
ErocM
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.