Как дольше поддерживать курсоры в v $ sql_plan в рабочем состоянии

#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.