理系学生日記

おまえはいつまで学生気分なのか

SQL 実行の高速化

SQL を実行する際は、SQL 実行用のバッファが確保された後、解析処理が行われる。解析にはハード解析とソフト解析があり、解析済みの SQL に対しては負荷の低いソフト解析が用いられる。両者の大きな違いは、ハード解析ではオブジェクトの定義チェック、オブジェクトへの解析用ロック、実行計画の策定とその結果の保存が行われること。解析した SQL は共有 SQL 領域に入るが、この領域の容量にも限りがあり、過去の解析データは破棄されていく。そのため、この領域に十分な容量を割り当てることが、性能向上には重要。

この解析のコストは高いが、PL/SQL ではキャッシュされたカーソルを再利用することで、解析の必要をなくすことができる。これを行うためには、暗黙的なカーソルの生成ではなく、明示的にカーソルを生成して SQL を実行する。このとき、SESSION_CACHED_CURSORS の値を増やしておくこと(デフォルトは0)。この値はセッションでキャッシュ可能なクローズ済カーソルの最大値を意味する。

SQL でハード解析を防ぐためには、SQL テキストの完全一致(大文字・小文字からスペースまでが一致することが求められる)、バインド変数の一致、参照オブジェクトの一致という条件を満たすことが求められる。ただし、CURSOR_SHARING が "EXACT" でない場合はこの限りではない。