一時セグメント
一時セグメントとは何ぞや?
一時セグメントとは、Oracle により内部的に使用される領域です。Oracleでは、問合せの処理中に、SQL文を処理する中間的な段階で、一時的な作業領域が必要になることがよくあります。通常、一時セグメントは、ソート操作の作業領域として必要です。ソート操作がメモリー内で実行できる場合、または Oracleが索引を使って操作を実行する別の方法を見つけた場合、一時セグメントは作成されません。
一時セグメントはいつ作られるの?
ロールバックセグメントはあらかじめ作成しておく必要がありますが、一時セグメント
はユーザーが作成するのではなく、必要に応じてインスタンスが自動的に作成して使用します。Oracleインスタンスは、起動後はじめて一時セグメントを使用するソート処理が実行されたときに一時セグメントを表領域内に1つだけ作成し、データベース停止時までこの領域を解放しません。このセグメントは、複数のトランザクションから利用されますが、セグメント内の1つのエクステントの複数のトランザクションで共有することはできません。一時セグメント内のエクステントの割り当てに関する情報は、SGA内のソートエクステントプールと呼ばれる領域に格納されています。
このように、一時セグメントは自動的に作成されるのですが、どの表領域を使うのかということは設定しておく必要があります。これはユーザーごとに設定します。ユーザーを作成するときに指定する一時表領域が一時セグメント用に使用されます。
scott の一時表領域がtemporary _ data であるとしましょう。このとき、scott から発行されたSQL を処理するために一時セグメントが必要になれば、temporary _ data に一時セグメントが作成されます。
一時セグメントを必要とする操作は?
次のコマンドでは、一時セグメントを使うことが必要になる場合があります。
たとえば、問合せにDISTINCT句、GROUP BY句、およびORDER BY句が含まれている場合、2つの一時セグメントが必要になる可能性があります。アプリケーションで上記の文を頻繁に発行する場合は、データベース管理者が初期化パラメータSORT_AREA_SIZEを調整してパフォーマンスを改善するとよいでしょう。
ソート処理に必要なメモリのサイズが初期化パラメータSORT_AREA_SIZEで指定されたサイズを超えた場合、ソートは複数回実行され、中間結果はディスク内の一時セグメントに格納されます。ソート処理に必要なメモリ量は処理件数に影響され、処理件数が多いほど一時セグメントが使用される確率が高くなります。
一時セグメントは何処に作成される?
一時セグメントは永続表領域と一時表領域のどちらにも作成することができますが、一時表領域は一時セグメントだけに使用される表領域であり、一般のセグメントは置くことができません。一時表領域を作成するには、表領域作成時にTEMPORARY句を指定するか、表領域作成後に一時表領域に変更します。
一時セグメントはユーザー・セッション中に必要なだけ割り当てられます。たとえば、ユーザーは、3つの一時セグメントを必要とする問合せを発行することがあります。一時セグメントは、その文が完了すると削除されます。一時セグメントのエクステントの記憶特性は、一時セグメントが作られた表領域のデフォルト値によって決まります。
一時セグメントは、文を発行したユーザーの一時表領域内に作られます。この表領域は、TEMPORARY TABLESPACEオプションを付けたCREATE USERまたはALTER USERコマンドで指定します。これらのコマンドで指定しない場合、SYSTEM表領域がデフォルトの一時表領域として使われます。
一時セグメントの割当てと割当て解除は頻繁に発生するため、一時セグメント専用の表領域を作成するとよいでしょう。これによって、ディスク・デバイス間でI/Oを分散させるとともに、 SYSTEM表領域やその他の表領域に一時セグメントが保持されることによって生じる断片化を避けることもできます。
ソート領域として永続表領域が割り当てられている場合は、永続表領域内に一時セグメントが作成され、SQL文が完了するたびにバックグラウンドプロセスSMONに削除されます。そのため、表領域が断片化されやすくなります。
その他
一時セグメントに書き込まれるデータのサイズは常にSORT_AREA_SIZEで設定した値と等しくなります。そこで、一時表領域を作成する場合は、INITIALとNEXTの値をSORT_AREA_SIZEの倍数+DB_BLOCK_SIZEに設定し、PCTINCREASEを0にして、すべてのエクステントが同じサイズになるようにします。
一時表領域内の一時セグメントには、エクステント数の制限がありません。つまり、MAXEXTENTSは、必ずUnlimitedになります。
REDOログには、ソート操作用の一時セグメントに対する変更のエントリは含まれません。
表領域の割当て制限は、一時セグメントの作成時には考慮されません。
一時表領域に関して重要なのは、ユーザーの一時表領域がどこに設定されているのか知っておくことと、一時セグメントに使用される表領域のデフォルトの記憶領域パラメータとタイプを適切に設定しておくことです。この2 点に関して、初期データベースではどのようになっているのか調べてみましょう。
まず、ユーザーの一時表領域を調べます。SQL_Plus からsystem で接続して次のように入力します。
SQL>
SELECT username,temporary_tablespace FROM dba_users;
USERNAME
TEMPORARY_TABLESPACE
------------------------------
------------------------------
SYS
SYSTEM
SYSTEM
TEMPORARY_DATA
ORDSYS
SYSTEM
DEMO
TEMPORARY_DATA
DBSNMP
SYSTEM
SCOTT
TEMPORARY_DATA
TARO
TEMPORARY_DATA
HANAKO
TEMPORARY_DATA
MDSYS
TEMPORARY_DATA
9 行が選択されました。
次は、各表領域のタイプ(一時セグメント専用であるか否か)を調べます。
SQL>
SELECT tablespace_name,contents FROM dba_tablespaces;
TABLESPACE_NAME
CONTENTS
---------------
---------
SYSTEM
PERMANENT
USER_DATA
PERMANENT
ROLLBACK_DATA
PERMANENT
TEMPORARY_DATA
PERMANENT
ここで、contents がPERMANENT になっていれば通常の表領域です。一時セグメント専用
の表領域は、contents がTEMPORARY になります。初期データベースは、すべての表領域が
通常の表領域であることがわかります。
以上