Oracleの親・子カーソルの調査方法についてのメモです。
目次
調査で使用するSQL
親カーソル数のカウント
1 |
select count(*) from V$SQLAREA; |
子カーソル数のカウント
1 |
select count(*) from V$SQL; |
子カーソルが再利用されなかった理由を確認
1 |
select * from V$SQL_SHARED_CURSOR; |
親カーソル・子カーソルとは
解析済のSQL文には、1つの親カーソルと1つ以上の子カーソルがあります。
親カーソルにはSQLのテキストが格納され、子カーソルには実行計画などが格納されます。
僕の理解では、SQLを発行する際にキャッシュされている実行計画の再利用のため
- 親カーソルに一致するSQL文があるか確認。不一致の場合は、新たに親カーソルを生成する。
- 一致する親カーソルが存在する場合、その子カーソルの実行計画が使用できるか確認。
- 2で子カーソルが使用できないと判断した場合、新たな子カーソルを生成する。(使用出来ないと判断した理由は、V$SQL_SHARED_CURSOR に記録される。)
というような流れで処理される認識です。
親カーソルとは
- 親カーソルにはSQLのテキストが格納されます。
- SQL文が異なる場合、別の親カーソルが作成されます。(大文字・小文字の違いだけでも、親カーソルは新たに生成されます。)
- 親カーソルが格納されるテーブル(V$SQLAREA)
子カーソルとは
- 親カーソルには必ず1つ以上の子カーソルが生成されます。
- 子カーソルには、実行計画・バインド変数などの情報が含まれます。ただし、SQLのテキストは格納されません。
- 子カーソルが格納されるテーブル(V$SQL)
- 子カーソルが共有されなかった理由(V$SQL_SHARED_CURSOR)