ソート処理の効率を上げる

 ソート領域の大きさを調整すると共に,関連パラメータとしてSORT_AREA_RETAINED_SIZEも調整する必要がある。これは,ソート処理の間に確保されたメモリー上のソート領域を,処理が完了した後,結果行が返される前の時点でどれだけの容量を解放せずに残しておくかを指定するパラメータである。最後の結果行が返された際には,ソート領域はSORT_AREA_RETAINED_SIZEで確保されている領域も含めすべての領域がUGA(ユーザー・グローバル・エリア)*に対して解放される。

 このパラメータを明示的に指定しない場合は,SORT_AREA_SIZEと同じ値となる。物理メモリーが非常に少ない場合や,マルチスレッド・サーバー接続である場合を除いてSORT_AREA_RETAINED_SIZEはSORT_AREA_SIZEと同じ値にする。調整が必要な場合は,最低でもSORT_AREA_SIZEの半分は確保しておく。

 また,大量のデータを高速に処理するためにはパラレル・クエリー*が有効となる場合がある。しかし,ソート処理を伴う場合はソート処理も並行して行われることになるので,通常以上に大きなソート領域が必要になる。パラレル・クエリーでは各サーバーにSORT_AREA_SIZEで指定するソート領域が必要となり,全体のメモリー容量としては「SORT_AREA_SIZE×2×並列度」が確保される。

ダイレクト書き込み機能で高速化

表1●ソート処理関連の主なパラメータ

 メモリーと一時表領域のサイズが十分にある場合は,「ダイレクト書き込み機能」で大量データのソート処理を高速化することも考えられる。ダイレクト書き込み機能は,初期化パラメータSORT_DIRECT_WRITESを調整することで制御する(表1[拡大表示])。

 通常のディスク・ソートでは,一時表領域のテンポラリ・セグメントを使用し,データベース・バッファ経由でデータが書き込まれる。そのため大量データのソート処理が発生すると,データベース・バッファがテンポラリ・セグメントで占められてしまい,全体のキャッシュ・ヒット率が低下してパフォーマンスが悪化してしまう。

 ここで,SORT_DIRECT_WRITESにTRUEを指定すると,データベース・バッファを使用せず,ソート処理ごとに,直接ディスクI/Oのための複数のバッファがメモリーに割り当てられる。この場合のソート処理はデータベース・バッファをバイパスして直接ディスクに書き込まれるため,パフォーマンスの向上が図れる。

 このパラメータにAUTOを指定することもできるが,その場合は書き込み用の専用バッファは確保されずにソート領域を利用するため,その領域が不足した場合はディスク・ソートになってしまう可能性が高くなる。そのため大量データのソート処理については,TRUEを指定したい。TRUEを指定した場合は,各バッファの数と大きさを,初期化パラメータSORT_WRITE_BUFFERSとSORT_WRITE_BUFFER_SIZEを設定することで制御する。確保される領域の大きさは,「SORT_WRITE_BUFFERS×SORT_WRITE_BUFFER_SIZE」で求められる。

 SORT_DIRECT_WRITESにTRUEを指定するための注意点としては,ソート処理を実行するOracleプロセスに対して,ソート領域用に既に割り当てられているメモリーに加え,さらにメモリーが必要になるため,メモリー全体の使用状況に対する考慮が必要になることである。一般的なガイダンスとしては,SORT_AREA_SIZEが640Kバイト以上で,かつ物理メモリーに十分な余裕がある場合,このダイレクト書き込み機能を使用してもよいだろう。また,このモードを利用した場合は一時表領域への書き込み要求が競合する可能性が高まるため,一時表領域を配置するディスクをストライピング*しておくことが欠かせない。

(内藤 尚=システムコンサルタント オープンシステム統括部 マネージャー)