ablog

不器用で落着きのない技術者のメモ

初期化パラメータ OPEN_CURSORS とはなんぞや?

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を共有する場合、バインド変数は共有できないからプライベート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内に保持されます。

メモリー・アーキテクチャ

共有SQL領域とプライベートSQL領域

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)

Oracle Core: Essential Internals for DBAs and Developers (Expert's Voice in Databases)

P.162 CURSORS
の説明がとても良いです。

The Term cursor is one of the many vague and multi-valued terms that float around the Oracle world...