Oracle - 処理時間の長いのセッションの表示


V$SESSION_LONGOPSは、処理時間の長い(6秒以上)さまざまな処理の進捗率・予想残り時間・処理ブロック数などの有用な情報を示します。現在これらの操作には、多くのバックアップおよびリカバリ機能、統計収集、問合せ実行、およびOracleリリースごとに追加される多くの操作が含まれます。

下記にV$SESSION_LONGOPSを検索するサンプルコードを提示します(シェル化しています)。watchコマンドで連続的に実行するとさらにいいと思います。

#!/bin/bash

# 「V$SESSION_LONGOPS」を参照できるユーザを指定
USER_ID=scott
PASSWORD=tigger
INSTANCE_NAME=oracle

# 「EOT」の前の「\」は変数展開をしない設定
sqlplus -s ${USER_ID}/${PASSWORD}@${INSTANCE_NAME} <<\EOT
	SET LINESIZE 1000
	SET PAGESIZE 1000
	SET FEED OFF
	ALTER SESSION SET NLS_DATE_FORMAT = "YYYY/MM/DD HH24:MI:SS";
	ALTER SESSION SET NLS_TIMESTAMP_FORMAT = "YYYY/MM/DD HH24:MI:SSXFF";

	COLUMN SID FORMAT 999999
	COLUMN SERIAL# FORMAT 9999999
	COLUMN MESSAGE FORMAT A100

	SELECT
	SID,
	SERIAL#,
	START_TIME,
	round((SOFAR / TOTALWORK * 100), 2) "PROGRESS(%)",
	TIME_REMAINING,
	ELAPSED_SECONDS,
	MESSAGE
	FROM
	V$SESSION_LONGOPS
	WHERE
	-- まず終了していないものを表示
	TIME_REMAINING != 0 OR
	-- 終了から1時間以内のものも表示 (終了時刻 > 1時間前)
	(START_TIME + ELAPSED_SECONDS / 86400) > (sysdate - 1 / 24)
	-- 終わっていないもの:残り時間が長い順
	-- 終わっているもの :開始時刻の順
	order by TIME_REMAINING desc, START_TIME desc, 1, 2
	;
EOT

exit