SQL Причины изменения плана - PullRequest
2 голосов
/ 22 апреля 2020

Один из планировщиков заданий работает ежедневно в производственной среде, которая использует только 20 минут прошлой истории выполнения, но сегодня прошло более 2 часов, но она еще не завершена.

a) Как проверить, изменился ли план SQL сегодня или нет?

б) Какие могут быть причины изменения плана? Один я знаю из-за изменения кода. Что еще может вызвать изменение плана?

1 Ответ

0 голосов
/ 24 апреля 2020

Вы можете проверить, изменился ли план выполнения 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'));

Существует много причин, по которым планы выполнения могут измениться. Если вы добавите дополнительную информацию к вопросу, я смогу сделать обоснованное предположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...