長いSQLクエリをすぐに強制終了/停止する方法は?


93

SQL Server 2008とその管理スタジオを使用しています。多くの行を生成するクエリを実行しました。赤いキャンセルボタンでキャンセルしようとしたのですが、10分以上止まりません。通常3分以内に停止します。

その理由は何でしょうか、どうすればすぐに停止できますか?


アプリケーションがこのクエリを保持していることを確認しましたか?
user1102001

1
停止して、再度お使いのSQLサービスを再起動します。..
user1102001

SQLですべてを実行していても、私のプロファイルを編集したいのかどうかわからないので、このシナリオに直面しました...
user1102001

@ user1102001-何もすることを強制しない。私はできるとすべきではないと述べました:)
sequel.learner '10

回答:


66

理由は何ですか

注意がサーバーに到達して処理できる場合、クエリのキャンセルは即座に行われます。クエリはキャンセル可能な状態である必要があります。SQLCLRからWebサービスを呼び出すなどの特定の操作を行う場合を除いて、ほとんどの場合はtrueです。注意がサーバーに届かない場合、通常はスケジューラの過負荷が原因です。

ただし、クエリがロールバックが必要なトランザクションの一部である場合、ロールバックを中断することはできません。10分かかる場合は、10分かかりますが、何もすることができません。サーバーを再起動しても効果はありませんが、リカバリがロールバックを完了する必要があるため、起動が長くなるだけです。

答えるためにそのあなたのケースに適用される具体的な理由は、自分を調査する必要があります。


SSMSは、アテンション応答が受信された後にのみ(キャンセルを試みるのではなく)クエリを「キャンセル」として表示することに注意してください。これは、最初に通信パイプのすべての中間結果(たとえば、TCP / IP送受信バッファおよびすべてのインメモリバッファ)。
Remus Rusanu 2013

1
「ロールバック」と表示されたらいいのに
Simon_Weaver

@RemusRusanu-推定ロールバック時間が20,000時間以上の場合はどうなりますか?バックアップから復元して満足です。dba.stackexchange.com/questions/222145/...
youcantryreachingme

108
sp_who2 'active'

CPUTimeDiskIOの値を確認します。比較的値が大きいプロセスのSPIDに注意してください。

kill {SPID value}

私はMicrosoft SQL Server 2008 R2を使用しています。実行されて中断されているクエリのSPIDを調べようとしたところ、同じSPIDを持つ同じSELECT SQLのインスタンスが多数あることがわかりました。コマンドKILL 114を実行しようとすると、中断されたクエリのSPID値が114になります。以下のエラーが表示されます。ご案内ください。メッセージ102、レベル15、状態1、行2「114」付近の構文が正しくありません。
コードバスター

40

最初に以下のコマンドを実行します:

sp_who2

その後、上記のコマンドから取得したSPIDを使用して以下のコマンドを実行します。

KILL {SPID value}

22

これはばかげた答えのようなものですが、少なくとも私の場合は確実に機能します。ManagementStudioでは、[クエリの実行をキャンセル]でクエリが停止しない場合、クリックするだけで現在のSQLドキュメントを閉じます。クエリをキャンセルするかどうかを尋ねられます。「はい」と答えると、数秒後に実行が停止します。その後、閉じる前にドキュメントを保存するかどうかを尋ねられます。この時点で、[キャンセル]をクリックしてドキュメントを開いたままにして作業を続けることができます。舞台裏で何が起こっているのかはわかりませんが、うまくいくようです。


5
この場合、クエリは実際にはまだバックグラウンドで実行/ハングしている可能性がありますが、表示されなくなります。
Aries51 2015年

1
この後で再接続する必要があるので、接続が強制終了されると思います。
anakic 2015年

2
SSMSへの接続を強制終了しますが、(必ずしも)dbへの接続は強制終了しません。
Aries51 2015

1
私はこれを試しましたが、私のSQLがハングアップしました。T_T
ボット

1
あなたがそれを見ることができないなら、それは存在しません。
ChrisD

13

キャンセルしてその実行を確認した場合

 sp_who2 'active'

(アクティビティモニターは、古いSQLサーバー2000で使用できません)

殺したいSPIDを見つけます。例:81

Kill 81

sp_who2 'active' もう一度実行 すると、おそらく眠っていることに気づくでしょう...ロールバック

ステータスを取得するには、KILLを再度実行します

Kill 81 

次に、このようなメッセージが表示されます

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

11

キーボードショートカットALT+ Breakを使用して、クエリの実行を停止できます。ただし、これがすべての場合に成功するわけではありません。


1
これはManagement Studioで私のために働いています。ありがとう
Vishvanathsinh Solanki 2018年

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

他の人がそれから学ぶことができるように編集して、回答にいくつかの説明を追加してください
ニコハセ

2

どうやらSQLサーバー2008 r2 64ビットでは、IISからの長時間のクエリでkill spidが機能しないようで、クエリが何度も再起動されるだけです。そしてそれはspidのを再利用しているようです。クエリにより、SQLサーバーは常に35%のCPUを使用し、Webサイトをハングさせます。私はbc /それがログインのための他のクエリに応答できないと思います


2
私はこれのソースを見たいです。
Ant Swift

1

私の側では、無限に実行中にSQLを閉じようとすると、SQLがハングしました。だから私がやったことは、タスクマネージャーを開いて、SQLクエリを終了することです。これは私のSQLを停止して再起動しました。


1

赤い「停止」ボックスが機能しない場合の簡単な答えは、キーボードの「Ctrl + Break」ボタンを押すことです。

Linux上でSQL Serverを実行している場合、「killall」と呼ばれるシステムトレイに追加できるアプリがあります。「killall」ボタンをクリックし、ループに巻き込まれたプログラムをクリックすると、プログラムが終了します。お役に立てば幸いです。


1

昔から同じことに悩んでいます。これは特に、リモートサーバーに接続している場合(遅い可能性があります)、またはネットワーク接続が悪い場合に発生します。マイクロソフトが正しい答えが何であるかを知っているかどうか疑問です。

しかし、私は解決策を見つけようとしたので。唯一の素人のアプローチが働いた

  • あなたが苦しんでいるクエリのタブの上にある閉じるボタンをクリックしてください。しばらくすると(Microsoftが厳しくなければ!!!)、これを尋ねるウィンドウが表示されることがあります。

「クエリは現在実行中です。クエリをキャンセルしますか?」

  • 「はい」をクリックします

  • しばらくすると、このクエリを保存するかどうか尋ねられます。

  • 「キャンセル」をクリックしてください

そして投稿してください、あなたがクエリを実行するために再びスタジオが安定しているかもしれません。

それがバックグラウンドで行うことは、接続を使用してクエリウィンドウを切断することです。そのため、クエリを再度実行するには、リモートサーバーに再度接続するのに時間がかかります。しかし、このトレードオフは、そのタイマーが永遠に実行されるのを見ることの苦しみよりもはるかに優れています。

PS:これは私にとってはうまくいきます。!!!


1
それでも私のために働き、->
ErocM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.