您的位置:首页 > 数据库

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

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

    一、隔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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql table 任务 insert dao jobs