ablog

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

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

oracle-l メーリングリストsga - oracle-l - FreeLists)を読んでたら、Oracle の初期化パラメータ CURSOR_SHARING が話題にあがっていたので調べてみた。まず、初期化パラメータ OPEN_CURSORS とはなんぞや? - ablog を読んでカーソルとはなんぞやということを思い出して、CURSOR_SHARING について自分なりの理解をメモしておく。

  • カーソルを再利用するか否かの判断を厳格にするかだいたいでするかを指定するパラメータ。
  • SHARINGは並列じゃなくて直列に共有するという意味。共有=再利用。
  • EXACTはリテラル含め完全一致しないと再利用しない。
  • SIMILARやFORCEはリテラルは違ってもSQLが同じなら再利用する。
  • SIMILARやFORCEにすると、OracleSQL文を解析してリテラル部分を自動的にバインド変数化してくれる。
  • 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

*1:意志決定支援システム。データベースに会社の経営に役立つ情報を蓄積し、経営戦略の作成に役立つ情報を検索、出力するシステム。厳密にいえばデータウェアハウスとは同義ではないが、同じような意味で使われることも多い。

*2:実行計画をRDBMSに保存する機能