新・ソートに関する検証 その8
<新・ソートに関する検証 その8>
ペンネーム グリーンペペ
さて、先週の問題の回答です。
まず、shared poolにメモリソート領域が割り当てられようとしているのは何
接続の場合だったでしょうか?
セッション情報を確認してみます。
■セッション情報の確認
SQL> select sid,serial#,server from v$session where username = 'XPRT'; SID SERIAL# SERVER ---------- ---------- ------------------ 10 2105 SHARED
SERVER列がSHAREDになっていることから共有サーバー(MTS)接続であることが
わかります。
詳細はメルマガバックナンバーVol.191をご参照下さい。
では、多くのメモリソート領域がshared poolに割り当てようとされたこと原
因で発生しているORA-4031エラーは回避可能なのでしょうか?
皆様から寄せられた回答を検証してみましょう。
■解決策その1
~large_pool_sizeの設定~
初期化パラメタにlarge_pool_sizeが設定された場合、共有サーバ接続の場合
のメモリソート領域はlarge poolに割り当てられます。
ただし、今回の設定条件は充分な空き領域がありませんのでlarge_pool_size
を大きく設定することはできません。
仮に100MBのlarge_pool_sizeを設定してみます。
SQL> alter system set large_pool_size=100M; システムが変更されました。 SQL> select id,sum(cost) from code group by id; ORA-04031: 共有メモリーの8192バイトを割当てできません("large pool", "unknown object","sort subheap","sort key")
100MB程度のlarge_pool_sizeの設定では焼け石に水のようです。
もちろんshared_pool_sizeを減らして、更に大きなlarge_pool_sizeを設定す
ることは可能ですが集計処理のためだけに巨大なlarge_pool_sizeを設定して
おくことはあまり現実的ではありません。
■解決策その2
~専用サーバー接続に変更する~
そもそも、ORA-4031エラーはshared poolやlarge poolなどのSGAにメモリ
ソート領域が割り当てられたことが原因で発生しています。
これをPGAに割り当てるように変更することでエラーを回避することができ
ます。メモリソートがPGAに割り当てられるようにするには、専用接続に変
更することで可能です。
tnsnames.ora の CONNECT_DATA句に『 (SERVER=DEDICATED) 』と記述したサー
ビスを作成し、作成したサービスを使用して接続すれば専用サーバー接続にな
ります。仮に専用サーバー接続にて集計処理を行います。
SQL> select sid,serial#,server from v$session where username = 'XPRT'; SID SERIAL# SERVER ---------- ---------- ------------------ 10 14 DEDICATED SQL> select id,sum(cost) from code where rownum<=1000000 group by id; 1000000行が選択されました。
エラーを回避することができました。
メモリソート領域をPGAに割り当てるようにするにはもうひとつ方法があり
ます。
続きは来週。
週末は雪でした。箱根にて。