主页 > 其他  > 

定期自动统计大表执行情况

定期自动统计大表执行情况

一、创建用户并赋权

create user dbtj identified by oracle default tablespace OGGTBS; grant connect,resource to dbtj; grant select any dictionary to dbtj; grant create job to dbtj; grant manage scheduler to dbtj;

二、创建存储表

1、连接到新建用户

conn dbtj/oracle

2、按大表2千万为维度,统计出大表,再根据大表找到最近一天的sql,统计其执行效率(毫秒),创建数据存储表

create table dbtj.dbtj_tab as select to_char(b.end_interval_time, 'yyyy-mm-dd-hh24') as datet, SQL_ID, sum(a.executions_delta) exec_d, sum(a.buffer_gets_delta) buffer_d, sum(a.disk_reads_delta) disk_d, round(sum(a.elapsed_time_delta / 1000000), 3) et_d, round(decode(sum(a.executions_delta), 0, sum(a.elapsed_time_delta), sum(a.elapsed_time_delta / 1000) / sum(a.executions_delta)), 2) et_onetime from dba_hist_sqlstat a, dba_hist_snapshot b where a.snap_id = b.snap_id and a.instance_number = b.instance_number and a.sql_id IN (SELECT DISTINCT (SQL_ID) FROM GV$SQL_PLAN SP WHERE (sp.OBJECT_OWNER, sp.OBJECT_NAME) in (select owner, table_name from dba_tables where num_rows >= 20000000 and owner not in ('SYS', 'SYSTEM'))) AND B.end_interval_time >= SYSDATE - 6/24 group by to_char(b.end_interval_time, 'yyyy-mm-dd-hh24'), SQL_ID having(sum(a.executions_delta)) > 0 order by 1;

三、创建存储过程,将第二步的查询结果插入到数据表dbtj_tab

create or replace procedure dbtj_proc as begin insert into dbtj.dbtj_tab select to_char(b.end_interval_time, 'yyyy-mm-dd-hh24') as datet, SQL_ID, sum(a.executions_delta) exec_d, sum(a.buffer_gets_delta) buffer_d, sum(a.disk_reads_delta) disk_d, round(sum(a.elapsed_time_delta / 1000000), 3) et_d, round(decode(sum(a.executions_delta), 0, sum(a.elapsed_time_delta), sum(a.elapsed_time_delta / 1000) / sum(a.executions_delta)), 2) et_onetime from dba_hist_sqlstat a, dba_hist_snapshot b where a.snap_id = b.snap_id and a.instance_number = b.instance_number and a.sql_id IN (SELECT DISTINCT (SQL_ID) FROM GV$SQL_PLAN SP WHERE (sp.OBJECT_OWNER, sp.OBJECT_NAME) in (select owner, table_name from dba_tables where num_rows >= 20000000 and owner not in ('SYS', 'SYSTEM'))) AND B.end_interval_time >= SYSDATE - 6/24 group by to_char(b.end_interval_time, 'yyyy-mm-dd-hh24'), SQL_ID having(sum(a.executions_delta)) > 0 order by 1; commit; end;

四、创建定时任务,每天1、7、13、19 统计

begin dbms_scheduler.create_job( job_name =>'dbtj_job', job_type =>'STORED_PROCEDURE', JOB_ACTION =>'dbtj_proc', START_DATE =>TO_TIMESTAMP_TZ('2022-07-11 22:10:00 +8:00','YYYY-MM-DD HH24:MI:SS TZH:TZM'), REPEAT_INTERVAL =>'FREQ=DAILY;BYHOUR=01,07,13,19', ENABLED =>TRUE); END;

五、测试

begin dbtj_proc; end; begin dbms_scheduler.enable('dbtj_job'); end; begin dbms_scheduler.run_job('dbtj_job'); end; BEGIN DBMS_SCHEDULER.DROP_JOB('dbtj_job'); END; select * from dbtj.dbtj_tab;

六、结果展示  

dbtj.dbtj_tab select datet as "时间",sql_id,exec_d as "执行次数",et_onetime as "每次耗时(毫秒)" from dbtj.dbtj_tab where datet >= to_char(sysdate-1,'yyyy-mm-dd-hh24') order by 1;

标签:

定期自动统计大表执行情况由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“定期自动统计大表执行情况