Извлечь sql_id из hash_value - PullRequest
1 голос
/ 30 июня 2019

У меня есть sql хэш-значение запроса.

У меня нет sqltext, plan hash или sql_id - только хеш-значение sql.

Когда я запрашиваю представление v$sql, результата нет (я думаю, что sql уже не в памяти):

select * from v$sql where hash_value = 'hv_Example';

Есть ли способ получить sql_id из hash_value?

Я не нашел представление, которое содержит хеш-значение и объединение sql_id ...

1 Ответ

0 голосов
/ 01 июля 2019

V$SQL содержит и HASH_VALUE и SQL_ID, но не навсегда.

Согласно блогу Танеля Подера , HASH_VALUE может быть получено из SQL_ID, но обратная операция невозможна. Но преобразование HASH_VALUE в SQL_ID все равно не решит вашу проблему.

Прежде всего, я не уверен, почему у вас будет доступ к HASH_VALUE, но не к SQL_ID. SQL_ID гораздо чаще используется для настройки производительности. Независимо от того, что программа или источник предоставляет, HASH_VALUE следует изменить, чтобы вместо него возвращалось SQL_ID.

Но настоящая проблема здесь, независимо от того, какое значение вы имеете, состоит в том, что данные не хранятся постоянно в V$SQL. По мере старения операторов они устаревают из общего пула и исчезают с V$SQL. Кроме того, если вы используете кластерную систему, убедитесь, что вы используете GV$SQL.

Если вы используете Enterprise Edition и лицензировали Oracle Diagnostic Pack, вы можете найти исторические значения SQL_ID с помощью одного из следующих двух утверждений:

select sql_id
from gv$active_session_history
where sql_full_plan_hash_value = 'XYZ';

select sql_id
from dba_hist_active_sess_history
where sql_full_plan_hash_value = 'XYZ';

Данные в GV$ACTIVE_SESSION_HISTORY обычно длятся около суток. Данные в DBA_HIST_* по умолчанию остаются в течение 8 дней, но их можно настраивать. Вы можете проверить сохранение AWR с помощью этого запроса: select retention from dba_hist_wr_control;

Если HASH_VALUE менее старый, чем период хранения, но все еще не в AWR, то вы, вероятно, можете его проигнорировать. ASH и AWR используют выборку, что означает, что они не захватывают все , что происходит в базе данных. ASH отбирает образец каждую секунду, а AWR - каждые 10 секунд.

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

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