`

常用Oracle数据库调优工具介绍

阅读更多

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('&mynextdate 03:00:00','YYYY-MM-DD HH24:MI:SS'),

'to_date(''&mynextdate 03: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('&mynextdate 03:10:00','YYYY-MM-DD HH24:MI:SS'),

'to_date(''&mynextdate 03: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('&mynextdate 18:30:00','YYYY-MM-DD HH24:MI:SS'),

'to_date(''&mynextdate 18:30:00'',''YYYY-MM-DD HH24:MI:SS'') + 7');

commit;

1.4. 删除重复的索引
查找重复的索引

select *

from

( select index_owner,

index_name,

table_owner,

table_name,

max(decode(p, 1, c,NULL)) ||

max(decode(p, 2,', '||c,NULL)) ||

max(decode(p, 3,', '||c,NULL)) ||

max(decode(p, 4,', '||c,NULL)) ||

max(decode(p, 5,', '||c,NULL)) ||

max(decode(p, 6,', '||c,NULL)) ||

max(decode(p, 7,', '||c,NULL)) ||

max(decode(p, 8,', '||c,NULL)) ||

max(decode(p, 9,', '||c,NULL)) ||

max(decode(p,10,', '||c,NULL)) ||

max(decode(p,11,', '||c,NULL)) ||

max(decode(p,12,', '||c,NULL)) ||

max(decode(p,13,', '||c,NULL)) ||

max(decode(p,14,', '||c,NULL)) ||

max(decode(p,15,', '||c,NULL)) ||

max(decode(p,16,', '||c,NULL)) index_cols

from (select index_owner,index_name,table_owner,table_name, substr(column_name,1,30) c, column_position p

from dba_ind_columns )

group by index_owner,index_name,table_owner,table_name ) A,

( select index_owner,

index_name,

table_owner,

table_name,

max(decode(p, 1, c,NULL)) ||

max(decode(p, 2,', '||c,NULL)) ||

max(decode(p, 3,', '||c,NULL)) ||

max(decode(p, 4,', '||c,NULL)) ||

max(decode(p, 5,', '||c,NULL)) ||

max(decode(p, 6,', '||c,NULL)) ||

max(decode(p, 7,', '||c,NULL)) ||

max(decode(p, 8,', '||c,NULL)) ||

max(decode(p, 9,', '||c,NULL)) ||

max(decode(p,10,', '||c,NULL)) ||

max(decode(p,11,', '||c,NULL)) ||

max(decode(p,12,', '||c,NULL)) ||

max(decode(p,13,', '||c,NULL)) ||

max(decode(p,14,', '||c,NULL)) ||

max(decode(p,15,', '||c,NULL)) ||

max(decode(p,16,', '||c,NULL)) index_cols

from (select index_owner,index_name,table_owner,table_name, substr(column_name,1,30) c, column_position p

from dba_ind_columns )

group by index_owner,index_name,table_owner,table_name ) B

where a.table_owner=b.table_owner

and a.table_name=b.table_name

and (a.index_owner<>b.index_owner

or a.index_name <> b.index_name )

and a.index_cols like b.index_cols || '%'

and a.owner not in (‘SYS’,’SYSTEM’,’OUTLN’,’WMSYS’)

and a.table_name not like '%$%'

出来的结果中,排在后面的索引是可以删除的。

1.5. 做为一项常规任务,每个月做一次停下应用的维护
检查哪些表碎片比较多,对这些碎片很多的表做move,同时将失效的索引全部重建。

这一项任务是在已经对表都做了分析的情况下来做。

做scrīpt0,对表全部做分析

begin

dbms_stats.gather_schema_stats (‘JZ21’);

end;

/

针对所有的schema都做一次。

--查看哪些表的空间碎片比较大,目前是认为大于30%就做整理。

select * from (

Select owner,table_name,(num_rows*avg_row_len/8000),blocks,

(num_rows*avg_row_len/8000)/( decode(blocks,0,1,null,1,blocks)) bb

from dba_tables where owner in (‘JZ21’)

and TEMPORARY=’N’

) tt

where tt.bb<0.7 and blocks>10;

--生成整理脚本scrīpt1

select ‘alter table ‘||owner||’.’||table_name||’ move; ’ from (

Select owner,table_name,(num_rows*avg_row_len/8000),blocks,

(num_rows*avg_row_len/8000)/( decode(blocks,0,1,null,1,blocks)) bb

from dba_tables where owner in (‘JZ21’)

and TEMPORARY=’N’

) tt

where tt.bb<0.7 and blocks>10;

--预备好分析脚本,不过这个脚本应该最后做scrīpt3

select 'exec dbms_stats.gather_table_stats( '''||owner||''','''||table_name||''' ,method_opt => ''for all columns'', cascade => true ); ' from (

Select owner,table_name,(num_rows*avg_row_len/8000),blocks,

(num_rows*avg_row_len/8000)/( decode(blocks,0,1,null,1,blocks)) bb

from dba_tables where owner in (‘JZ21’)

and TEMPORARY='N'

) tt

where tt.bb<0.7 and blocks>10;

--生成重建索引脚本scrīpt2

select ‘alter index ‘||owner||’.’||index_name||’ rebuild nologging;’ from dba_indexes where owner in (‘JZ21’) and status='UNUSABLE' ;

步骤:先执行scrīpt0

结束后,生成scrīpt1,scrīpt2,scrīpt3

按顺序执行,scritp1,scrīpt2,scrīpt3。

1.6. 特殊情况下对数据库重新整理
1.6.1. 对表做move
alter table test_move move ;

select ‘alter table ‘||owner||’.’||table_name||’ move; ’ from dba_tables where owner in (‘JZ21’) and TEMPORARY=’N’;

这里用需要做move的schema替换。

1.6.2. 对index做rebuild
alter INDEX idx_test_move rebuild nologging;

select ‘alter index ‘||owner||’.’||index_name||’ rebuild nologging;’ from dba_indexes where owner in (‘JZ21’);

1.6.3. 对所有的表做分析
begin

dbms_stats.gather_schema_stats (‘JZ21’);

end;

/

针对所有的schema都做一次。

1.7. 对索引打开监视开关,看哪些索引没有被使用(慎用)
select ‘alter index ‘||owner||’.’||index_name||’ monitoring usage;’ from dba_indexes

where owner not in (‘SYS’,’SYSTEM’);

在运行了一个很完整的周期以后(对我们来说,例如2个完整的交易日),检查有哪些索引没有被使用

select index_name,monitoring,used,start_monitoring,end_monitoring from v$object_usage

where used='NO';

如果这些索引不是主键或唯一索引,一般情况下这些索引可以去掉。

检查完一次以后,将索引监视关闭,不需要老是监视索引的使用:

select ‘alter index ‘||owner||’.’||index_name||’ nomonitoring usage;’ from dba_indexes where owner in (‘WHT’);

2. 语句调优
2.1. PL/SQL中的语法解释工具
语句的执行效率是否符合需要,一个是简单的把语句提取出来直接执行一下,看效果如何,但很多情况下,语句的运行是根据实际的条件运行的,所以有时候我们写完语句有要先分析一下语句是否是最优的,这时候我们就可以用PL/SQL的explain窗口(或直接选种语句后,按F5),有时侯,我们已知语句比较慢,要寻找为什么会慢,也可以如此做。

在EXPLAIN窗口,我们需要关注几个重要的东西,COST(成本),如果这个COST数字很大,说明语句效率不高,需要想办法;有无TABLE ACCESS FULL,如果有,只要数据量大一些,效率就不会高。我们要尽量避免产生table access full,方法之一就是建索引,另一个方法是改写连接方式,使能够用到索引。另一个需要关注的是join方式,nest loops outer 和hash join outer,这两种方式的效果是不一样的,有时有天壤之别,目前我没有类似的经验可以写,以后碰到后补充。

2.2. ORACLE提供的调优工具
ORACLE 本身提供了很好的客户端的性能调试和跟踪工具。ORACLE的工具非常好,可以帮助我们很容易的找到系统性能的瓶颈语句在哪里。ORACLE性能调整工具的位置在:

开始—程序—Oracle – Orahome92 – Enterprise Management Packs –Diagnostics –Performance Manager,登陆后找到数据库栏,然后连接就可以看到。

分享到:
评论

相关推荐

    Oracle调优工具使用研究.pdf

    MYTUN则是另一种调优工具,它可能是指Oracle的自动管理功能或者其他第三方的数据库调优工具。MYTUN通常用于根据数据库的工作负载和当前状态,自动调整数据库的参数设置,以优化性能。MYTUN可能会包括自动索引创建、...

    Oracle系统调优办法

    为了确保Oracle数据库能够高效稳定地运行,并且能够满足业务发展的需求,进行Oracle系统的性能调优就显得尤为重要。 性能调优的目标主要包括: - 提高数据库查询速度。 - 减少系统资源消耗(如CPU、内存等)。 - ...

    Oracle数据库性能调优研究.pdf

    Oracle数据库性能调优是数据库管理的关键环节,旨在提高数据处理速度和系统响应时间,从而提升整体应用系统的效率。本文主要探讨了几个关键的调优策略。 首先,日志管理是数据库性能的重要因素。日志文件包含了...

    数据库调优:ORACLE EXPLAIN PLAN的总结

    总结来说,掌握`EXPLAIN PLAN`的使用和解析,是Oracle数据库调优的关键技能之一。通过深入理解执行计划,我们可以有效地改进SQL查询,提升数据库的整体性能。对于开发者和DBA而言,这是一项必不可少的技能,能帮助...

    ORACLE数据库设计与优化

    《ORACLE数据库设计与优化》 Oracle数据库是全球广泛使用的大型关系型数据库系统之一,它在数据存储、处理和管理方面具有强大的功能。本主题主要探讨Oracle数据库的设计原则和优化策略,以提升系统的性能和效率。 ...

    oracle常用管理工具

    本文将详细介绍Oracle中的一些常用管理工具,包括Oracle Database Configuration Assistant (DBCA)、SQL*Plus、SQL*Plus Worksheet以及Oracle Enterprise Manager (OEM)。 1. **Oracle Database Configuration ...

    Oracle数据库服务器配置

    Oracle数据库服务器配置是数据库管理员和IT专业人员在部署和管理Oracle...随着经验的积累,还应深入学习Oracle数据库的体系结构、性能调优、备份恢复、安全管理等高级主题,以便更好地管理和维护Oracle数据库环境。

    ORACLE数据库性能调优方法及应用研究.pdf

    Oracle数据库性能调优是针对数据库系统的优化过程,旨在提高数据处理速度、降低响应时间、提升系统吞吐量,以满足日益增长的业务需求。在江苏省社会法人信用基础数据库的案例中,性能低下主要由以下几个因素引起: ...

    Oracle数据库学习指南

    7. Oracle for NT系统实用工具介绍 8. Oracle 和 mysql 的一些简单命令对比参照 9. Oracle8i和Microsoft SQL Server7_0比较 10. Oracle8的不安全因素及几点说明 11. Oracle常见错误代码 12. Oracle常用Script ...

    Oracle数据库性能分析

    ### Oracle数据库性能分析 #### 一、Oracle体系结构 Oracle数据库是一个复杂且功能强大的关系型数据库管理系统(RDBMS),其核心组件包括实例和数据库文件。理解Oracle的体系结构对于优化性能至关重要。 - **实例**...

    MYSQL性能调优工具介绍与应用

    ### MySQL性能调优工具介绍与应用 MySQL作为全球最广泛使用的开源关系型数据库之一,在企业级应用中的地位不可动摇。为了确保MySQL能够高效稳定地运行,掌握一系列性能调优工具至关重要。本文将详细介绍多种MySQL...

    Oracle数据库设计文档——帮助数据库初学者了解数据库设计

    此外,Oracle数据库设计也包括对数据库性能监控和调优。通过使用工具如SQL*Plus、Oracle Enterprise Manager或日志分析,我们可以发现性能瓶颈并采取相应的优化措施。 总的来说,Oracle数据库设计是一门深奥但实用...

    10-Oracle数据库(学习4天).txt

    - **Oracle管理工具**:介绍常用的Oracle管理工具,如SQL*Plus、Enterprise Manager等,以及如何利用这些工具对数据库进行管理和维护。 #### 第三天:性能调优与备份恢复 - **性能监控**:了解Oracle数据库的性能...

    Oracle 数据库2天 DBA

    - **DBCA (Database Configuration Assistant):** 用于创建、配置和管理Oracle数据库的图形化工具。 #### Oracle数据库基础知识 - **Oracle数据库的特点:** 高性能、高可用性、安全性强。 - **Oracle数据库架构:** ...

    张烈-Oracle数据库讲义

    - **版本介绍**:Oracle数据库10g版本作为Oracle公司推出的第三代产品,是基于网格计算技术的重要里程碑。它集成了许多高级特性,如自动存储管理(ASM)、实时应用集群(RAC)等,极大提升了数据库的性能和可用性。 ...

    linxu系统安装oracle数据库需要rpm包

    在安装Oracle数据库时,我们需要一系列特定的RPM包来确保所有必要的库和工具都已就绪。 首先,Oracle数据库对硬件和软件环境有一定的要求。确保你的Linux系统版本与Oracle数据库兼容,通常Oracle支持CentOS、Red ...

    Oracle数据库教程.txt

    ### Oracle数据库教程知识点详解 #### 一、Oracle数据库概述 - **定义与特点**: - Oracle数据库是由美国Oracle公司开发的一款关系型数据库管理系统。它以其高性能、高可靠性及强大的功能在众多数据库产品中...

    unix和linux下的oracle数据库管理

    在IT领域,Unix和Linux操作系统是企业级Oracle数据库系统常用的操作环境。Oracle数据库因其稳定性、高性能和可扩展性,被广泛应用于大型企业及关键业务系统。本书“Unix和Linux下的Oracle数据库管理”深入探讨了在...

    oracle数据库教程文档.zip

    这一章节通常会介绍Oracle数据库的基础概念,包括数据库的构成、数据存储结构以及如何创建和管理数据库对象如表、索引、视图等。此外,还会涉及SQL语言的基本用法,如数据查询、插入、更新和删除操作。 “第二章--...

Global site tag (gtag.js) - Google Analytics