Oracle の初期化パラメータ OPEN_CURSORS は1つのセッション(接続)で同時にオープンできるカーソル(プライベートSQL領域へのハンドル)の最大数。例えば、OPEN_CURSORS が300の場合、10セッション張ったら、1セッション辺り300、10セッションで3000のカーソルをオープンすることができるってことか。
そもそもカーソルってなんだ?
ちょっと調べてみた。
- SQL文は、共有SQL領域とプライベートSQL領域(カーソル)に格納される。
- 共有SQL領域は共有プールのライブラリキャッシュ内にあり、SQL文の解析ツリーと実行計画が格納される。要するにコンパイル済みのバイナリが格納されてるってことか。
- プライベートSQL領域(カーソル)には以下の情報が格納される。
なるほど、なるほど。当たり前だけど、セッション間で共有可能な情報が共有SQL領域に、共有不可能な情報がプライベートSQL領域(カーソル)に格納される。で、共有SQL領域にコンパイル済みSQLが格納され、プライベートSQL領域(カーソル)にはSQL実行結果と実行状況が格納される(ワークエリアって感じか)。バインド変数を使ってコンパイル済みSQLを共有する場合、バインド変数は共有できないからプライベートSQL領域(カーソル)に格納されるってことか。ちょっとイメージがつかめてきた。
[参考]
OPEN_CURSORS
プロパティ 説明 パラメータ・タイプ 整数 デフォルト値 50 変更の可/不可 ALTER SYSTEM 値の範囲 0〜65535 基本/基本以外 基本 OPEN_CURSORSには、1つのセッションで同時にオープンできるカーソル(プライベートSQL領域へのハンドル)の最大数を指定します。カーソルとは、解析済の文と、処理に使用するその他の情報が保持されるメモリー内の領域(プライベートSQL領域)のハンドルまたは名前のことです。
http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05771-03/initparams.htm#93802
表4-1 パフォーマンスに影響を与えない必要な初期化パラメータ
パフォーマンスを考慮したデータベースの構成
パラメータ 説明 OPEN_CURSORS 1セッション当たりのカーソル(アクティブなSQL文)の最大数に対する制限。設定はアプリケーションにより異なり、推奨値は500です。
カーソル
カーソルとは、解析済の文と、処理に使用するその他の情報が保持されるメモリー内の領域(プライベートSQL領域)のハンドルまたは名前のことです。
ほとんどのOracle DatabaseユーザーはOracle Databaseユーティリティの自動カーソル処理を使用しますが、プログラム・インタフェースを利用すると、アプリケーション設計者はカーソルを制御しやすくなります。アプリケーション開発の場合、カーソルはプログラムが使用できる名前付きのリソースです。特にアプリケーションに埋め込まれたSQL文の解析に使用できます。
ユーザー・セッションごとに、初期化パラメータOPEN_CURSORSで設定された値を上限として、複数のカーソルをオープンできます。ただし、システム・メモリーを節約するには、アプリケーション側で不必要なカーソルをクローズする必要があります。カーソル数の制限のためにカーソルをオープンできない場合、データベース管理者はOPEN_CURSORS初期化パラメータを変更できます。
Oracle Databaseは暗黙的に再帰的SQL文を発行する必要があり、再帰カーソルが必要になる場合があります(主としてDDL文の場合)。たとえば、CREATE TABLE文を使用すると、新しい表と列を記録するために、各種データ・ディクショナリ表に多数の更新が加えられます。これらの再帰カーソルに対して再帰コールが発行されます。1つのカーソルで複数の再帰コールが実行されることもあります。それらの再帰カーソルでは、共有SQL領域も使用します。
SQL
プライベートSQL領域
プライベートSQL領域には、バインド変数値、問合せ実行状況の情報、および問合せ実行作業領域などのデータが格納されます。SQL文を発行するそれぞれのセッションには、プライベートSQL領域があります。同一のSQL文を発行するそれぞれのユーザーは、1つの共有SQL領域を使用する専用のプライベートSQL領域を持っています。これにより、プライベートSQL領域の多くは、同一の共有SQL領域に対応付けることができます。
プライベートSQL領域の位置は、セッションのために確立される接続のタイプによって異なります。セッションが専用サーバーを介して接続されている場合、プライベートSQL領域はサーバー・プロセスのPGA内にあります。ただし、セッションが共有サーバーを介して接続されている場合、プライベートSQL領域の一部はSGA内に保持されます。
メモリー・アーキテクチャ
Oracle Databaseでは、実行される各SQL文が、共有SQL領域とプライベートSQL領域によって表されます。Oracle Databaseは、2人のユーザーが同じSQL文を実行する場合にそれを認識し、これらのユーザーのために共有SQL領域を再利用します。ただし、各ユーザーは、その文のプライベートSQL領域のコピーを各自で持つ必要があります。
共有SQL領域には、特定のSQL文の解析ツリーと実行計画が含まれます。Oracle Databaseでは、多数のユーザーが同じアプリケーションを実行するときには特に、複数回実行されるSQL文に1つの共有SQL領域を使用することによってメモリーを節約します。
Oracle Databaseでは、新しいSQL文が解析された時点でメモリーが共有プールから割り当てられ、共有SQL領域に格納されます。このメモリーのサイズは、文の複雑度に応じて決められます。共有プール全体が割当て済の場合、Oracle Databaseでは、新しい文の共有SQL領域のための空き領域が十分になるまで、修正したLRUアルゴリズムを使用してその共有プールからエントリの割当てを解除できます。Oracle Databaseが共有SQL領域の割当て解除する場合、対応付けられていたSQL文は次の実行時に再解析され、別の共有SQL領域に再び割り当てられます。
メモリー・アーキテクチャ
追記(2012.09.06):
Oracle Core: Essential Internals for DBAs and Developers (Expert's Voice in Databases)
- 作者: Jonathan Lewis
- 出版社/メーカー: Apress
- 発売日: 2011/12/06
- メディア: ペーパーバック
- クリック: 3回
- この商品を含むブログを見る
の説明がとても良いです。
The Term cursor is one of the many vague and multi-valued terms that float around the Oracle world...