老李分享:Oracle数据库调优工具
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标。如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-84505200。性能调优是Poptest测试开发工程师就业培训课程的重要组成部分,我们不断的优化这部分内容,提高学员的技术能力,
1. 数据库 级调优
1.1. 修改数据库参数
以 sys 用户登录,运行如下的命令 :
alter system set optimizer_index_cost_adj=10 scope=spfile
alter system set optimizer_dynamic_sampling=5 scope=spfile
optimizer_index_cost_adj 取值 0-1000 ,缺省 100 ; 值越小 oracle 就越趋向使用索引
optimizer_dynamic_sampling 配置 oracle 对没有统计信息的表会动态采样,会得到更准确的统计信息,同时让优化器得到更准确的执行计划。这个参数对临时表尤其有用。
1.2. 分析表
应该把所有没有做过分析的表都做一下分析:
执行如下语句的返回结果。
select
'analyze table '||owner||'.'||table_name||' compute statistics; '
from dba_tables
where num_rows is null
and owner not in ('SYS','SYSTEM')
and table_name not like '%$%'
and temporary = 'N'
如果针对 SCHEMA 里的所有表做分析 , 以 JZ21 为例
begin
dbms_stats.gather_schema_stats ('JZ21' );
end;
/
1.3. 增加数据维护的job
1.3.1. 将表的监视打开
select ‘alter table ‘||owner||’.’||table_name||’ monitoring; ’
from dba_tables
where owner not in (‘SYS’,’SYSTEM’,’OUTLN’,’WMSYS’ )
and table_name not like '%$%'
and TEMPORARY=’N’;
这个监视是在内存中做的,一般情况下对性能不会有什么影响,如果发现实在有影响的时候,
下面语句关闭监视,
select ‘alter table ‘||owner||’.’||table_name||’ nomonitoring; ’
from dba_tables
where owner not in (‘SYS’,’SYSTEM’,’OUTLN’,’WMSYS’ )
and table_name not like '%$%'
and TEMPORARY=’N’;
1.3.2. 添加 JOB
用 sys 用户登录
执行如下语句, mynextdate,mynextSatdate 需要手工更改为下一日和下一个周六。
define mynextdate='2004-03-03'; --to_char(sysdate + 1,'yyyy-mm-dd');
define mynextSatdate='2004-03-06'; --to_char(NEXT_DAY(sysdate,7),'yyyy-mm-dd');
-- 每天早上 3 点左右执行 flush monitor info
call sys.dbms_job.remove(101);
call sys.dbms_job.isubmit( 101,
'sys.DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO();',
to_date('&mynextdate03:00:00','YYYY-MM-DD HH24:MI:SS'),
'to_date(''&mynextdate03:00:00'',''YYYY-MM-DD HH24:MI:SS'') + 1');
commit;
-- 统计数据库信息
call sys.dbms_job.remove(102);
call sys.dbms_job.isubmit( 102,
'sys.dbms_stats.gather_database_stats (options => ''GATHER STALE'');',
to_date('&mynextdate03:10:00','YYYY-MM-DD HH24:MI:SS'),
'to_date(''&mynextdate03:10:00'',''YYYY-MM-DD HH24:MI:SS'') + 1');
commit;
-- 每周六下午 6:30 把执行对那些被更新特别频繁的表的索引做 rebuild
call sys.dbms_job.remove(201);
call sys.dbms_job.isubmit( 201,
'execute immediate ''alter INDEX history.PK_INCREMENT_STOCK_BALANCE_HIS rebuild nologging'';'||
'execute immediate ''alter INDEX history.ind_inc_stock_balance_1 rebuild nologging'';'||
'execute immediate ''alter INDEX history.ind_inc_stock_balance_2 rebuild nologging'';'||
'execute immediate ''alter INDEX history.PK_TB_INCREMENT_BALANCE_HIS rebuild nologging'';'||
'execute immediate ''alter INDEX history.Ind_inc_balance rebuild nologging'';',
to_date('&mynextdate18:30:00','YYYY-MM-DD HH24:MI:SS'),
'to_date(''&mynextdate18:30:00'',''YYYY-MM-DD HH24:MI:SS'') + 7');
commit;
转载于:https://blog.51cto.com/10988776/1745295