|
|
|
 |
 |
 |
第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章 共有サーバー構成での共有プールの割当てについて学ぶ |
|
|
|
|
|
 |
|
|
|