Как сохранить курсоры в v $ sql_plan дольше - PullRequest
6 голосов
/ 12 апреля 2011

Я пытаюсь проанализировать план выполнения запроса в моей базе данных 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 ]

5 голосов
/ 15 апреля 2011

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

dbms_shared_pool.keep ('[address, hash_value from v$open_cursor]', 'C');
4 голосов
/ 13 апреля 2011

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

...