DBA_HIST_SQLSTAT: ненулевое время, в то время как номер выполнения равен нулю

Здравствуйте, я обнаружил странную ситуацию с некоторой статистикой sql_ids в представлении dba_hist_sqlstat. Похоже, что они имеют ненулевые значения прошедшего времени, когда значения выполнения равны нулю. Я не понимаю, как это возможно. Может быть, в ситуациях, когда сеанс неактивен или происходит событие ожидания. У вас когда-нибудь была похожая ситуация и что это может значить?

select sql_id, plan_hash_value, snap_id, sum(executions_delta), sum(elapsed_time_delta) from dba_hist_sqlstat group by sql_id, plan_hash_value, snap_id having sum(executions_delta) = 0;

SQL_ID        PLAN_HASH_VALUE SNAP_ID SUM(EXECUTIONS_DELTA) SUM(ELAPSED_TIME_DELTA)
------------- --------------- ------- --------------------- -----------------------        
0v3dvmc22qnam               0   14212                     0                     116 
cfz686a6qp0kg                   14223                     0                       0 
7ng34ruy5awxq                   14203                     0                       0 
b07vcvuxryvg9      2129701755   14219                     0                       0 
czvfg1255s5zg       775635102   14202                     0                       0 
b07vcvuxryvg9                   14209                     0                       0 
cfz686a6qp0kg                   14201                     0                       0 
b07vcvuxryvg9      2129701755   14201                     0                       0 
5rxbazwmcdfaz               0   14202                     0                    1263 

1 ответ

Решение

Долгосрочный запрос, охватывающий несколько снимков, будет иметь время выполнения без каких-либо выполнений, если вы посмотрите только на один снимок. В противном случае сумма EXECUTIONS_DELTA будет неверной.

В одном сеансе создайте таблицу и запустите длительный запрос:

create table test3 as
select level a from dual connect by level <= 100000;

select count(*) from test3 cross join test3 cross join test3;

Пока он работает, откройте другой сеанс и создайте несколько снимков:

begin
    dbms_workload_repository.create_snapshot;
    dbms_lock.sleep(5);
    dbms_workload_repository.create_snapshot;
end;
/

Используйте V$SQL, чтобы найти SQL_ID, но он будет таким же, как показано ниже, если вы будете использовать тот же текст, что и выше. Выполнение запроса учитывается только в одном снимке, но время записывается в двух снимках.

select sql_id, plan_hash_value, snap_id,
    sum(executions_delta),
    sum(elapsed_time_delta)
from dba_hist_sqlstat
where sql_id = '09pgf63pczkxg'
group by sql_id, plan_hash_value, snap_id;

SQL_ID        PLAN_HASH_VALUE SNAP_ID SUM(EXECUTIONS_DELTA) SUM(ELAPSED_TIME_DELTA)
09pgf63pczkxg 3377121179      5570    1                     22001734
09pgf63pczkxg 3377121179      5571    0                      6010267
Другие вопросы по тегам