Как сохранить курсоры в 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');