私
ソート中にどれだけの一時表領域が使われているのかを見てみたい!
ソートの実行は一時表領域が使用され、ソート終了後にその領域は解放される。
ふた通りの方法で確認してみよう。
方法1:使用率(%)をSQLPLUSから確認する
ソート中の一時表領域の使用率は以下のSQLで確認することができる。
実行例
SQL>
SELECT d.tablespace_name "Name",
TO_CHAR(NVL(a.bytes / 1024 / 1024, 0),'99,999,990.900') "Size (M)",
TO_CHAR(NVL(t.hwm, 0)/1024/1024,'99999999.999') "HWM (M)",
TO_CHAR(NVL(t.hwm / a.bytes * 100, 0), '990.00') "HWM % " ,
TO_CHAR(NVL(t.bytes/1024/1024, 0),'99999999.999') "Using (M)",
TO_CHAR(NVL(t.bytes / a.bytes * 100, 0), '990.00') "Using %"
FROM sys.dba_tablespaces d,
(select tablespace_name, sum(bytes) bytes from dba_temp_files group by tablespace_name) a,
(select tablespace_name, sum(bytes_cached) hwm, sum(bytes_used) bytes from v$temp_extent_pool group by tablespace_name) t
WHERE d.tablespace_name = a.tablespace_name(+)
AND d.tablespace_name = t.tablespace_name(+)
AND d.extent_management like 'LOCAL'
AND d.contents like 'TEMPORARY';
Name Size (M) HWM (M) HWM % Using (M) Using %
------------------------------ --------------- ------------- ------- ------------- -------
TEMP 1,763.000 1762.000 99.94 .000 0.00
方法2:エクステント・ブロック単位で確認する
もっと細かく、エクステントやブロック単位で一時表領域がリアルタイムでどれだけ使われているかは、以下のSQLで確認することができる。
実行例
SQL>
SELECT S.USERNAME, U."USER", U.TABLESPACE, U.CONTENTS, U.EXTENTS,
U.BLOCKS FROM V$SESSION S, V$SORT_USAGE U WHERE S.SADDR=U.SESSION_ADDR;
レコードが選択されませんでした。
実際のリアルタイムの動き
セッションを二つ用意して、1つのセッションでソートを実行し、もう1つのセッションで前述したSQLを使ってリアルタイムで数値が増えていくのを確認してみよう。
SQL>
select emp1.* from
emp emp1
,emp emp2
,emp emp3
,emp emp4
,emp emp5
,emp emp6
,emp emp7
order by 1,2,3,4,5;
:
SQL>
SELECT S.USERNAME, U."USER", U.TABLESPACE, U.CONTENTS, U.EXTENTS,
U.BLOCKS FROM V$SESSION S, V$SORT_USAGE U WHERE S.SADDR=U.SESSION_ADDR;
USERNAME USER TABLESPACE CONTENTS EXTENTS BLOCKS
----------- ------- ----------- --------- ---------- ----------
SCOTT SCOTT TEMP TEMPORARY 98 12544
^^^^^ ^^^^^
SQL>
SELECT S.USERNAME, U."USER", U.TABLESPACE, U.CONTENTS, U.EXTENTS,
U.BLOCKS FROM V$SESSION S, V$SORT_USAGE U WHERE S.SADDR=U.SESSION_ADDR;
USERNAME USER TABLESPACE CONTENTS EXTENTS BLOCKS
----------- ------- ----------- --------- ---------- ----------
SCOTT SCOTT TEMP TEMPORARY 611 78208
^^^^^ ^^^^^
SQL>
SELECT S.USERNAME, U."USER", U.TABLESPACE, U.CONTENTS, U.EXTENTS,
U.BLOCKS FROM V$SESSION S, V$SORT_USAGE U WHERE S.SADDR=U.SESSION_ADDR;
USERNAME USER TABLESPACE CONTENTS EXTENTS BLOCKS
----------- ------- ----------- --------- ---------- ----------
SCOTT SCOTT TEMP TEMPORARY 1756 224768
^^^^^ ^^^^^
SQL>
SELECT S.USERNAME, U."USER", U.TABLESPACE, U.CONTENTS, U.EXTENTS,
U.BLOCKS FROM V$SESSION S, V$SORT_USAGE U WHERE S.SADDR=U.SESSION_ADDR;
レコードが選択されませんでした。
ソートが終了するとレコードが選択されなくなる = 領域が解放されている