老李分享: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;