Вы можете проверить, изменился ли план выполнения SQL, используя Active Workload Repository (AWR). Во-первых, вам нужно найти SQL_ID для соответствующего запроса. Представление GV$SQL
содержит самое последнее SQL. Если вы не можете найти запрос в этом представлении, попробуйте вместо этого DBA_HIST_SQLTEXT
.
select sql_id, sql_text
from gv$sql
where lower(sql_fulltext) like '%some unique string%';
С помощью SQL_ID вы можете приступить к изучению хронологической информации. Таблица DBA_HIST_SQLSTAT
содержит множество сводной информации о SQL. Самый важный столбец - PLAN_HASH_VALUE; если это значение изменяется, то план выполнения изменился.
select snap_id, sql_id, plan_hash_value, executions_delta, elapsed_time_delta/100000 seconds_delta
,dba_hist_sqlstat.*
from dba_hist_sqlstat
--join to dba_hist_snapshot if you want to find precise times instead of SNAP_IDs.
where sql_id = '&SQL_ID'
order by dba_hist_sqlstat.snap_id;
Если план изменился, вы можете просмотреть оба плана с помощью:
select * from table(dbms_xplan.display_awr(sql_id => '&SQL_ID'));
К сожалению, самая трудная часть настройки запроса с помощью Oracle заключается в том, что существует дюжина различных способов просмотра планов выполнения, и каждый из них предоставляет немного разные данные.
Этот запрос возвращает только числа для последнего выполнения, но возвращает фактический числа и время, которые помогут вам сосредоточиться на заданной операции c и событиях ожидания, вызвавших проблему.
select dbms_sqltune.report_sql_monitor(sql_id => '&SQL_ID', type => 'text') from dual;
Этот запрос возвращает некоторую дополнительную информацию о плане выполнения, в частности, раздел Note
. В большинстве графических IDE этот раздел не учитывается, но он крайне важен для комплексного устранения неполадок. Если происходит что-то странное, в разделе Note
часто объясняется, почему.
select * from table(dbms_xplan.display_cursor(sql_id => '&SQL_ID'));
Существует много причин, по которым планы выполнения могут измениться. Если вы добавите дополнительную информацию к вопросу, я смогу сделать обоснованное предположение.