#oracle #oracle11g #sql-execution-plan
#Oracle #oracle11g #sql-execution-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
.
Я что-то не так понимаю, или как я могу проанализировать оценочные / фактические значения после выполнения?
Ответ №1:
Вы всегда можете закрепить курсор, что является новым в 11g —
dbms_shared_pool.keep ('[address, hash_value from v$open_cursor]', 'C');
Комментарии:
1. Очень приятно, я этого не знал. И я предполагаю, что вам придется вручную удалить его снова, используя
dbms_shared_pool.purge
?2. Ага. Или закройте экземпляр. Это не будет повторяться автоматически.
3. Ах, я думаю, я предпочту
purge
, а не закрывать его 🙂
Ответ №2:
Увеличьте shared_pool, чтобы создать больше места для кэширования курсоров. Если в 11g, запишите sql-план в базовые параметры, используя optimizer_capture_sql_plan_baselines. При этом планы сохраняются в dba_sql_plan_baselines.