您好我在视图dba_hist_sqlstat中发现了一些sql_ids统计信息的奇怪情况。当执行值等于零时,那些似乎具有非零经过时间值。我不明白它是如何可能的。可能在会话处于非活动状态或存在等待事件的情况下。你有没有类似的情况,这是什么意思?
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
答案 0 :(得分: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