Как сохранить курсоры в V$sql plan дольше

Я пытаюсь проанализировать план выполнения запроса в моей базе данных Oracle. Я установил

alter system set statistics_level = all;

такие, что я могу сравнить оценочные мощности и время с фактическими мощности и времени. Теперь я запускаю это заявление, чтобы отобразить эту информацию.

select * from table(dbms_xplan.display_cursor(
    sql_id => '6dt9vvx9gmd1x', 
    cursor_child_no => 2, 
    FORMAT => 'ALLSTATS LAST'));

но я продолжаю получать это сообщение

NOTE: cannot fetch plan for SQL_ID: 6dt9vvx9gmd1x, CHILD_NUMBER: 2 
      Please verify value of SQL_ID and CHILD_NUMBER; 
      It could also be that the plan is no longer in cursor cache (check
      v$sql_plan)

на CHILD_NUMBER было правильно, когда запрос выполнялся. Кроме того, когда я бегу dbms_xplan.display_cursor в то же время как запрос, я получаю настоящий план. Но мое соединение JDBC закрывает PreparedStatement сразу после выполнения, так что, возможно, именно поэтому план выполнения исчезает из v$sql_plan.

Я получаю что-то неправильно, или как я могу анализировать сметная/фактические значения после выполнения?

2 ответов


увеличьте shared_pool, чтобы создать больше пространства кэширования для курсоров. Если в 11g, захватите план sql в базовых линиях с помощью optimizer_capture_sql_plan_baselines. Это хранит планы в dba_sql_plan_baselines.


вы всегда можете закрепить курсор, который является новым в 11г -

dbms_shared_pool.keep ('[address, hash_value from v$open_cursor]', 'C');