oracle-l メーリングリスト(sga - oracle-l - FreeLists)を読んでたら、Oracle の初期化パラメータ CURSOR_SHARING が話題にあがっていたので調べてみた。まず、初期化パラメータ OPEN_CURSORS とはなんぞや? - ablog を読んでカーソルとはなんぞやということを思い出して、CURSOR_SHARING について自分なりの理解をメモしておく。
- カーソルを再利用するか否かの判断を厳格にするかだいたいでするかを指定するパラメータ。
- SHARINGは並列じゃなくて直列に共有するという意味。共有=再利用。
- EXACTはリテラル含め完全一致しないと再利用しない。
- SIMILARやFORCEはリテラルは違ってもSQLが同じなら再利用する。
- SIMILARやFORCEにすると、OracleがSQL文を解析してリテラル部分を自動的にバインド変数化してくれる。
- SIMILARの場合、バインド値の違いにより最適な実行計画が異なる場合、その一つ一つをバージョンとして持ち、最適な実行計画で実行される。
- FORCEの場合、常に同一の実行計画で実行される。
- たしか、アプリケーションでカーソルをクローズしてもOracleは余裕があればメモリ上に残しておいて再利用する。ファイルシステムがページキャッシュするみたいに余裕があれば使う的な。
- DSS*1アプリケーションまたはストアド・アウトライン*2を使用するアプリケーションではEXACT推奨。
[参考]
門外不出のOracle現場ワザ (DB Magazine SELECTION) P.258-259
http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05771-03/initparams.htm#79635
共有プール領域に関する検証 その1 | Insight Technology, Inc.
http://tech.jsys-soft.jp/kaizen.php?itemid=424
http://tech.jsys-soft.jp/kaizen.php?itemid=426
[Oracle] CURSOR_SHARING=FORCEの環境でORA-01008エラーが発生 | Archive Redo Blog
[Oracle] 類似したSQLを強制的に共有する(CURSOR_SHARING) | Archive Redo Blog
データへの最短ルートを確保せよ! (4/4):データベースエンジニアへの道(5) - @IT