系统性能优化之如何查找循环操作数据库
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;
一、隔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;
相关文章推荐
- 网站性能优化实践-for循环中的数据库操作
- C#提升性能"数据库连接打开与关闭"经验分享(附:优化过的DBHelper类) 之配餐系统的开发
- 深刻理解代理模式在java中如何优化系统性能
- 系统性能调优(5)----Java循环与字符串代码优化
- JQuery each()函数如何优化循环DOM结构的性能
- 数据库性能优化:程序操作优化
- 3.如何优化操作大数据量数据库(实现小数据量和海量数据的分页显示存储过程)
- 数据库的优化以及如何提高数据库性能
- 如何使用REORG TABLE命令优化数据库性能
- 建立查询系统性能调优(3)----数据库索引优化
- 如何优化操作大数据量数据库(几十万以上数据)(二。改善SQL语句)
- 系统性能调优(5)----Java循环与字符串代码优化
- 不更改代码的情况下如何优化数据库系统
- 系统性能优化的时候循环和字符串处理
- 数据库性能优化三:程序操作优化
- 4.如何优化操作大数据量数据库(几十万以上数据)(如何选择聚合索引)
- Java - 使用JDBC操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能?
- 如何优化操作大数据量数据库(建立索引)
- 数据库性能优化:程序操作优化
- C#提升性能"数据库连接打开与关闭"经验分享(附:优化过的DBHelper类) 之配餐系统的开发