Oracle 実行中のSQLをストップしてみる

 2019.03.11  株式会社システムインテグレータ

SQLの実行結果がなかなか返ってこない・・・

「これで完璧!!」と自信を持って実行したSQL文。実は結合条件が甘く、待てど暮せど結果が返ってこない。こんな経験はありませんか?
こうなるとOracleは同一セッションでの動作を受け付けなくなり、ただただディスプレイの前でSQL結果が返るのを待つか、なんとかして実行中のSQLを止めるしかありません。このようなケースは、開発中には頻繁に起こりえます。

ALTER SYSTEM KILL SESSION

実行中のSQLを止めるには、「ALTER SYSTEM KILL SESSION」を発行する方法があります。SQL実行中のセッションIDとシリアルNOを指定して実行すると、そのセッションを停止することができ、結果としてSQLも強制終了させることが可能です。SI Object Browser for Oracle 18(以下OB)でも、セッション画面から同様の処理を行うことができます。メニューバー → 管理 → セッション情報と進み、該当のセッションを右クリックし、「切断」を選びます。

ALTER SYSTEM CANCEL SQL

Oracle 18cより以前は、上記が常套手段として認知されていましたが、Oracle18cから、「ALTER SYSTEM CANCEL SQL」が使用可能になっています。これを発行することで、実行中のSQLをキャンセルすることができます。もちろんOBでも使用可能です。操作の説明を兼ねてちょっとした実験をしてみましょう。

まず、OBを2つ立ち上げます。片方で、「終わらないSQL」を擬似的に再現するため、下記のSQLを実行します。

DECLARE
  t TIMESTAMP := SYSTIMESTAMP;
BEGIN
  WHILE SYSTIMESTAMP - t < INTERVAL '1000' SECOND LOOP NULL; END LOOP;
END;
/

これは、INTERVALのあとに指定した秒数だけ処理が繰り返される簡単な命令です。今回は1000秒指定しました。
実行したOBは処理結果待ちの状態になります。もうひとつのOBで、先程のセッション情報画面を開きます。該当のSQLを実行しているセッションを右クリックし、「SQLのキャンセル」を選びます。

Oracle 実行中のSQLをストップしてみる 1

「SQLのキャンセル」の実行

その後出力されるダイアログで「はい」を選択すれば、こちら側の処理は終了です。SQLを実行したOBに戻ってみましょう。

実行側のOBでは、「ORA-01013:ユーザーによって現行の操作の取り消しがリクエストされました」 のメッセージが出力されています。OBの操作も復帰しており、SQLが中断されたことがわかります。

Oracle 実行中のSQLをストップしてみる 2

SQLがキャンセルされた

 [RELATED_POSTS]

Oracle 実行中のSQLをストップしてみる まとめ

いかがでしたか。今までSQLを停止させる常套手段とされてきたALTER SYSTEM KILL SESSION ですが、これはセッションごと終了させてしまうため該当のSQLだけでなくそれ以外の操作も全て終了してしまうという、何かと不便な点がありました。ALTER SYSTEM CANCEL SQLであれば現在実行中のSQLのみ終了させることができます。接続し直さなくて済むので、展開中のデータなどはそのままに作業に戻ることができ効率的です。是非活用しましょう。


RELATED POST関連記事


RECENT POST「【OBトコ】DBの勉強」の最新記事


【OBトコ】DBの勉強

データベースのスキーマを理解する

【OBトコ】DBの勉強

データベース別インスタンスの関係性

【OBトコ】DBの勉強

ビューとマテリアライズド・ビューの違いを理解する

【OBトコ】DBの勉強

Oracle 表領域を拡張してみよう

Oracle 実行中のSQLをストップしてみる
新規CTA