ソートに関する検証 その9

投稿日: 2001年2月21日

~ソートに関する検証 その9 最終回 ~  ペンネーム ちゃむ

今回でソートに関する検証を最後にする。
今回は、ソートに関する動的パフォーマンス表である下記の2つを紹介する。
おそらく、以下のバージョンから参照できる。

v$sort_segment → Oracle7.3から
v$sort_usage   → Oracle8から

1.v$sort_segmentについて

ソートセグメントとその使用状況を確認するには、V$SORT_SEGMENTを確認する。
但し、この情報は、TEMPORARY(専用一時表領域)の表領域に作成された一時セグ
メントのみである。

SQL> desc v$sort_segment
名前                                                  NULL?    型
----------------------------------------------------- -------- -------------
TABLESPACE_NAME                                                VARCHAR2(31)
SEGMENT_FILE                                                   NUMBER
SEGMENT_BLOCK                                                  NUMBER
EXTENT_SIZE                                                    NUMBER
CURRENT_USERS                                                  NUMBER
TOTAL_EXTENTS                                                  NUMBER
TOTAL_BLOCKS                                                   NUMBER
USED_EXTENTS                                                   NUMBER
USED_BLOCKS                                                    NUMBER
FREE_EXTENTS                                                   NUMBER
FREE_BLOCKS                                                    NUMBER
ADDED_EXTENTS                                                  NUMBER
EXTENT_HITS                                                    NUMBER
FREED_EXTENTS                                                  NUMBER
FREE_REQUESTS                                                  NUMBER
MAX_SIZE                                                       NUMBER
MAX_BLOCKS                                                     NUMBER
MAX_USED_SIZE                                                  NUMBER
MAX_USED_BLOCKS                                                NUMBER
MAX_SORT_SIZE                                                  NUMBER
MAX_SORT_BLOCKS                                                NUMBER
RELATIVE_FNO                                                   NUMBER

ここで、TOTAL_EXTENTS、TOTAL_BLOCKS、USED_EXTENTS、USED_BLOCKS 、
FREE_EXTENTS、FREE_BLOCKSという列がある。
~_EXTENTSと~_BLOCKSはそれぞれ、エクステント数とブロック数である。
これらの列の関係を~_BLOCKSを用いて以下のURLで図示する(~_EXTENTSも同様)。

TOTAL_BLOCKSとMAX_BLOCKSとMAX_USED_BLOCKSは今までの検証では、数値的には同
じ値を示しているので、TOTAL_BLOCKSだけおさえておけばいいのではないだろうか?
MAX_SORT_BLOCKS列は今までのディスクソート処理のうち、一番大きいソート
ブロックサイズを示す。

このようにv$sort_segmentは一時表領域(PERMANENT)の情報は見れないので注意
してほしい。一時表領域(PERMANENT)が見れないのは、ソート終了後、毎回解放
してしまうからである。

2.v$sort_usageについて

セッションレベルのソートの状況を更に細かく取得したい場合、このv$sort_usage
で確認できる。これは、一瞬しか見れない情報なので、ソートが多発しているときに
見ると有効である。また、V$SORT_SEGMENTとは違い専用一時表領域(TEMPORARY)の
情報も、一時表領域(PERMANENT)の情報も見ることができる。

SQL> DESC V$SORT_USAGE
名前                                                  NULL?    型
----------------------------------------------------- -------- ----------
USER                                                           VARCHAR2(3
SESSION_ADDR                                                   RAW(4)
SESSION_NUM                                                    NUMBER
SQLADDR                                                        RAW(4)
SQLHASH                                                        NUMBER
TABLESPACE                                                     VARCHAR2(3
CONTENTS                                                       VARCHAR2(9
SEGTYPE                                                        VARCHAR2(9
SEGFILE#                                                       NUMBER
SEGBLK#                                                        NUMBER
EXTENTS                                                        NUMBER
BLOCKS                                                         NUMBER
SEGRFNO#                                                       NUMBER

ここで、重要な列はCONTENTS列とEXTENTS列とBLOCKS列であろうか。
CONTENTSは、専用一時表領域(TEMPORARY)か一時表領域(PERMANENT)を示す項目である。
EXTENTS列とBLOCKS列はソート処理時のエクステント数とブロック数である。

V$SORT_USAGEは、ソートを行なっている最中に取れる情報である。これをV$SESSIONと
V$SQLでジョインすることにより、どの一時表領域で、どのユーザが、どのプログラム
より、どのSQL文でディスクソートのために何ブロック使用しているかがわかる。

SELECT SORT.TABLESPACE,SORT.CONTENTS,SES.USERNAME,SES.PROGRAM,
       SQL.SQL_TEXT,SORT.BLOCKS FROM V$SESSION SES,
       V$SORT_USAGE SORT,V$SQL SQL
       WHERE SES.SADDR=SORT.SESSION_ADDR AND SES.SQL_ADDRESS=SQL.ADDRESS;

SQL> col TABLESPACE format a8
SQL> col CONTENTS  format a10
SQL> col USERNAME  format a8
SQL> col PROGRAM  format a10
SQL> col SQL_TEXT format a30
SQL> col BLOCKS format 999

TABLESPA CONTENTS   USERNAME PROGRAM    SQL_TEXT                       BLOCKS
-------- ---------- -------- ---------- ------------------------------ ------
TEMP1    TEMPORARY  CHAMU1   popsql.exe SELECT  EMPNO, ENAME, JOB, MGR    100
                                        , HIREDATE, SAL, COMM, DEPTNO
                                        FROM  T1MAN_1 ORDER BY S
                                        AL,COMM,DEPTNO

BLOCKSは、ソートしている最中にどんどん上がっていく。
これで、ソート負荷の高いSQLは見つけることができるだろう。

v$sort_segmentは主に累積値等を示し、v$sort_usageはセッションの一瞬の情報を
格納するという違いがあるので注意!!

以上 兄へ ホットプレートは茅ヶ崎においておくよ。 茅ヶ崎にて

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
▼ Oracle入門生活 ▼━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
<Oracle入門> ペンネーム モンキーターン

初心者の心をつかむべく、開始されたこの入門生活….。
しかし、今ひとつ初心に戻りきれなかったモンキーターンは、
もう1度ピュアな心を取り戻すべく、現在放浪の旅に出ております。
入門生活再開まで、今しばらくお待ちください。