SSブログ

SQL Server でセッションをSPID指定してkillしたときの挙動 [SQL Server]

SQL Serverでロックを長く持っているクエリをkillするオペレーションを行うことがあります。
ロックチェーンの先頭にいるクエリをkillすれば後続のセッションが動ける可能性があるからです。
もちろん後続のセッションがさらにロングクエリでもう一回killする、といったこともあり得ます。
さて、killしたセッションはすぐに終わるわけではなく、
killedのマークがつけられ、実際にはロールバックが行われます。
そのロールバックしている最中の様子をsp_who2とsysprocessesから見てみました。
必要な列、行だけ抜き出しています。
また採取タイミングが同期していません。

SPID Status Command CPUTime DiskIO
----- ---------------- ---------------- ------- ------
51 sleeping AWAITING COMMAND 77 40
52 RUNNABLE SELECT INTO 78 10
54 SUSPENDED KILLED/ROLLBACK 0 1
54 RUNNABLE KILLED/ROLLBACK 15 5

spid blocked waittime lastwaittype ecid status cmd
------ ------- --------- -------------------------------- ----- -------------- ----------------
51 0 0 MISCELLANEOUS 0 sleeping AWAITING COMMAND
52 0 0 SOS_SCHEDULER_YIELD 0 runnable SELECT
54 0 479307 ASYNC_IO_COMPLETION 0 suspended KILLED/ROLLBACK
54 0 531277 PREEMPTIVE_OS_FILEOPS 1 runnable KILLED/ROLLBACK

ここでSPID54を見ると複数行あります。
またecidを見ると0と1になっているので、ここでは並列クエリとして
ROLLBACKが実行されていることがわかります。
Create Databaseを途中で中止したのですが、I/Oにとても時間がかかっており、
Rollbackに時間を要しています。
(ASYNC_IO_COMPLETION等からの想定です)

killしてもすぐにセッションが居なくなるわけではないので、
実際killしたあと問題となっているセッションが居なくなったのかの
確認は必要でしょう。
状況次第(なかなかセッションが居なくならない、I/Oが帰ってこない、ドライバでスタックしている、等)
ではインスタンス再起動またはサーバ再起動まで波及することもあるかと思います。

スポンサードリンク




nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:仕事

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:[必須]
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。