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が帰ってこない、ドライバでスタックしている、等)
ではインスタンス再起動またはサーバ再起動まで波及することもあるかと思います。
スポンサードリンク
ロックチェーンの先頭にいるクエリを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が帰ってこない、ドライバでスタックしている、等)
ではインスタンス再起動またはサーバ再起動まで波及することもあるかと思います。
スポンサードリンク
コメント 0