系统性能优化之如何查找循环操作数据库

来源:互联网 发布:电信卡网络不好怎么办 编辑:程序博客网 时间:2024/05/22 02:19

      循环操作数据库对系统性能影响很大,试想一下,点击一个按钮打开和关闭数据库上万次,长时间占用连接池,同时消耗数据库性能。在专项代码走查中比较难发现这些问题。下面是我解决这个问题的思路,


    一、隔10分钟备份下v$sql的数据,有点模拟数据库的快照,awr报告中有SQL执行的次数,可惜是一个top排名,对于一个超大的系统来说,信息不太够。见附录一

    二、写程序对比,对于执行次数多的在工程中查找对应的表,查看相关的代码是否有循环操作的情况。本来是想把代码贴出来,由于时间比较赶,写的不太优美。


附录一

        --创建临时表

drop table sql_text;
create table sql_text nologging as select sysdate as gather_time,
v.SQL_ID,v.SQL_TEXT,v.EXECUTIONS,
v.FIRST_LOAD_TIME  from v$sql v where 0=1;
--隔10分钟备份一次v$sql
create or replace procedure p_sql_text as 
   id number; 
begin 
   insert /*+ append */  into sql_text select sysdate as gather_time,
   v.SQL_ID,v.SQL_TEXT,v.EXECUTIONS,
   v.FIRST_LOAD_TIME  from v$sql v;
   commit; 
end; 
--创建任务定时调用,并启动
variable  job_v_sql      number;
begin
dbms_job.submit(:job_v_sql,
               'p_sql_text;',
               sysdate,
               'sysdate+1/1440');
commit;
dbms_job.run(:job_v_sql);
end;
--查询任务id
select job,broken from user_jobs s where s.what='p_sql_text;';
--查询数据
select distinct gather_time  from sql_text order by gather_time;
--停止任务 dbms_job.broken(job_id,true)
execute dbms_job.broken(128,true);
commit;
--删除任务
begin
dbms_job.remove(128);--128是job_id   
commit;
end;
/
--删除临时表
truncate table sql_text;

drop table sql_text purge;

原创粉丝点击