データベースの稼働状況を診断共有するサイト パフォーマンスセラピー
Statspackとは Statspack設定 statspackでの情報収集 statspackレポートの出力 便利スクリプト Oracleチューニング講座


                                  
第13章 カーソルに関するパラメータの紹介
本章では、Oracleのカーソルに関するパラメータをいくつかご紹介します。
Oracleプリコンパイラ製品では、オープンしたカーソルをそのままオープンしておくことができます。そのような場合、再度同一のSQLが処理されても解析が行われず、ソフト解析も行われないため解析オーバーヘッドを低減でき、パフォーマンスを向上できます。

OPEN_CURSORSパラメータ
OPEN_CURSORSパラメータについてご紹介します。
このパラメータは、1つのセッションで同時にオープンできるカーソです。ルつまり、プライベートSQL領域へのハンドルの最大数を設定することができます。
OPEN_CURSORSパラメータを設定する場合は、アプリケーションでオープン・カーソル数が不足しないように大きめの値を設定します。また、オープンされたカーソルは約250バイトの共有SQL領域を使用するので、多くのカーソルをオープンしすぎるとメモリーを消費してしまうので注意が必要です。

以下の表1にOPEN_CURSORSパラメータの設定概要を記します。
表1
OPEN_CURSORSパラメータ
概要 1つのセッションで同時にオープンできるカーソル数を設定
構文 OPEN_CURSORS = 整数
デフォルト 50
変更の可/不可 可能:ALTER SYSTEM
もし、OPEN_CURSORパラメータの設定以上のカーソルがセッションでオープンする必要があった場合、「ORA-1000:最大オープン・カーソル数を超えました」エラーが発生しますので、その場合はパラメータの設定を変更してください。

CURSOR_SPACE_FOR_TIMEパラメータ
CURSOR_SPACE_FOR_TIMEパラメータをについてご紹介します。

このパラメータをTRUEに設定すると、共有SQL領域をオープンするカーソルが存在する限り、その共有SQL領域はメモリーから割当てを解除されません。また、プライベートSQL領域もカーソルがクローズされるまでメモリー割当てを解除されません。これによって、SQLの実行ステップにおいて解析コードが存在することが保証されるため、SQLの実行が高速になります。
しかし、このパラメータをTRUEに設定すると、同時にオープンされている全てのカーソルの共有SQL領域をメモリー上に保持できないといけないため、非常に大きなメモリーを使用する可能性があります。また、実行ステップのライブラリ・キャッシュ・ミスが発生している場合にTRUEにすると、新しいSQLを解析することができなくなるので注意が必要です。

以下の表2にCURSOR_SPACE_FOR_TIMEパラメータの設定概要を記します。
表2
CURSOR_SPACE_FOR_TIMEパラメータ
概要 オープン中のカーソルがメモリーから除去されないようにする
構文 CURSOR_SPACE_FOR_TIME = { TRUE | FALSE }
デフォルト FALSE
変更の可/不可 静的

以下にオープンしているカーソルの調査の実行例を記します。
例)現行セッションごとの合計オープン・カーソル数と現行オープン数を確認する
SQL> SELECT s.sid,username,
2 (SUM(DECODE(name,'opened cursors cumulative',value,0))) "OPENED CURSOR",
3 (SUM(DECODE(name,'opened cursors current',value,0))) "CURRENT CURSOR"
4 FROM v$session s,v$sesstat se,v$statname sn
5 WHERE se.sid = s.sid
6 AND se.statistic# = sn.statistic#
7 AND name in ('opened cursors cumulative','opened cursors current')
8 AND username is not null
9 GROUP BY s.sid,username
10 ORDER BY "OPENED CURSOR" desc,"CURRENT CURSOR" desc;

SID  USERNAME OPENED CURSOR CURRENT CURSOR
--------  ------------ ---------------- -------------------
254  DBSNMP 55003 36
230  SYSMAN 8762 32
227  DBSNMP 6664 21
272  SYS 1487 5
238  SYSMAN 857 21
228  SYSMAN 639 19
234  SCOTT 550 1
システム統計を示すのは以下です。
・opened cursors cumulative セッション開始以降のオープン・カーソル合計数
・opened cursors current    現行オープン・カーソル数

例)現在オープンしているカーソルを確認する(この例ではSCOTTユーザーのみ)
SQL> SELECT sid,user_name,sql_text
2 FROM v$open_cursor
3 WHERE user_name = 'SCOTT';

SID  USERNAME SQL_TEXT
--------  ------------ ----------------
234  SCOTT SELECT * FROM emp WHERE EMPNO = 1
260  SYSMAN SELECT * FROM emp WHERE EMPNO = 1
V$OPEN_CURSORビューは各ユーザー・セッションが現在すでにオープンして解析しているカーソルを示します。
以下にV$OPEN_CURSORビューの列について説明します。
<主な列>
・SADDR :セッション・アドレス
・SID :セッション識別子
・USER_NAME :ログイン・ユーザー名
・SQL_TEXT :SQL文の最初の60文字

SESSION_CACHED_CURSORSパラメータ
SESSION_CACHED_CURSORSパラメータにより、クローズされたカーソルをセッションにキャッシュすることができます。このとこを、セッション・カーソル・キャッシュと言います。
カーソルをキャッシュすることにより、その後同一のSQLは解析フェーズをバイパスする(ソフト解析も行わない)ことができます。
また、同一セッションで同じSQLを3回実行すると、キャッシュされます。
以下にSESSION_CACHED_CURSORSパラメータの設定概要を記します。
CURSOR_SPACE_FOR_TIMEパラメータ
概要 キャッシュするセッション・カーソル数を指定
構文 SESSION_CACHED_CURSORS = 数値
デフォルト 0
変更の可/不可 可/ALTER SESSION
パラメータで設定された数が、セッション・カーソル・キャッシュの上限となります。

以下にセッション・カーソル・キャッシュを使用した例を記します。
例)セッション・カーソル・キャッシュを使用する

SQL> SELECT name,SUM(value) "CURSOR CACHE HITS"
2 FROM v$sesstat s,v$statname t
3 WHERE name = 'session cursor cache hits'
4 AND s.statistic# = t.statistic#
5 GROUP BY name,value;

NAME CURSOR CACHE HITS
------------------------------  ----------------
session cursor cache hits 0

SQL> ALTER SESSION SET session_cached_cursors = 1;

セッションが変更されました。

SQL> SELECT COUNT(*) FROM dept; → このSQLを4回繰り返す。3回目でキャッシュされ、
                             4回目でキャッシュ・ヒット。
COUNT(*)
----------
4

SQL> SELECT name,SUM(value) "CURSOR CACHE HITS"
2 FROM v$sesstat s,v$statname t
3 WHERE name = 'session cursor cache hits'
4 AND s.statistic# = t.statistic#
5 GROUP BY name,value;

NAME CURSOR CACHE HITS
------------------------------  ----------------
session cursor cache hits 1

SQL> SELECT COUNT(*) FROM dept;

COUNT(*)
----------
4

SQL> SELECT name,SUM(value) "CURSOR CACHE HITS"
2 FROM v$sesstat s,v$statname t
3 WHERE name = 'session cursor cache hits'
4 AND s.statistic# = t.statistic#
5 GROUP BY name,value;

NAME CURSOR CACHE HITS
------------------------------  ----------------
session cursor cache hits 2
システム統計を示すものが、session cursor cache hitsです。
・session cursor cache hits セッション・カーソル・キャッシュにおけるヒットの数。

以上でOracleのカーソルに関するパラメータの紹介は終了です。
SQL解析の回数を減らしてパフォーマンスを向上させる対処を行う際に、本章を参考にしていただければと思います。
第14章では、共有サーバー構成での共有プールの割当てについて復習します。

               
           第14章 共有サーバー構成での共有プールの割当てについて学ぶ