oracle redo wait较高,实践Oracle 性能调优-从诊断到解决

01fac6460a22031b8af8da5848698a70.png

前言

本资料中,包含oracle数据库的系统中产生性能问题时,将对调查原因到完成调优为止,进行指导。

本资料面向对数据库具有基相关知识的人士。

因此,发生性能问题时的对策,仅仅讲解确认数据库是否有性能问题的方法,最多讲解处理性能问题的1个方法,但这也不是绝对的

请作为系统发生性能问题时的参考资料来灵活使用

发生了系统性能问题

3ed60d3cf4ae615e491fad583e264bdf.png

解决的顺序

为了解决问题,需要处理与考虑方法

指定出现性能问题的地方

执行调优

e2331ba729c137ae8e905f999c8b69ac.png

确认DB的性能问题

获得DB内部的统计信息,确认其是否发生了性能问题

DB内部的统计信息是指

性能统计信息(ex. 资源使用情况以及发生待机的信息)

执行各SQL时的详细信息

<方法>

Statspack(8i~)

AWR报告(10g~)

※Enterprise Edition中需要Diagnostic Pack选项

SQL 追踪(主要在测试环境中使用)

<参考>其他的推荐事先获得的信息

OS统计信息

-CPU统计信息

-磁盘统计信息

-内存统计信息

-网络统计信息

-运行进程统计信息

OS中的统计信息因为含有包含oracle以外的部分的服务器整体的资源信息

所以即使原因可能出在DB中,也可以获得

d1c30b07cf1eaef87893309996349714.png

在分析之前需要了解Statspack是什么

在使用DB内部的统计信息进行分析之前,先需要获得统计信息

理解各个方法的概要

<方法>

Statspack(8i~)

AWR报告(10g~)

※Enterprise Edition中需要Diagnostic Pack选项

SQL追踪(主要在测试环境中使用)

Statspack(StatisticsPackage)

Statspack 的意思是

从Oracle 8i 安装的oracle标准的性能分析工具

使用Statspack 的话

某段期间内,还可以确认oracle的运行情况

基本的Statspack使用流程

安装之后,可以定期获得统计信息

发生问题时,会将累积的统计信息生成报告

比较现有的报告(必要的话还可以同时比较过去的报告)进行分析

确认Statspack 的的信息,确认在执行SQL时,到底是什么原因导致了性能恶化

Statspack的机制

Statspack是两个不同时点分别作为snapshot来记录,仅仅从差异中输出报告

d4a13c536e36eebf24445eb99a426756.png

灵活地输出报告

输出报告时,可以指定使用任何snapshot,可以灵活地变更输出范围

2d0d04a28559b0a0bfdc7cb519e778d3.png

<参考>通过Statspack获得的信息(9iR2,10g,11g)

leve水平(获得的信息详细程度)设定参考基准

一般正常运行时默认为Level 5,如果感觉到“最近变得有点慢了”的时候,可以遵循oracle技术支持的意见调整为Level 6 、Level 7、或者Level 10(高负荷)

Snapshot level

收集数据

基本统计信息

建议信息

SQL统计信息

SQL详细信息

段信息

latch详细信息

Level 0

Level 5

Level 6

Level 7

Level 10

Statspack 使用顺序

Statspack的使用顺序如下所示

Step1 安装・设定

首次使用Statspack时,可以创建执行用的用户,同时可以设定密码与表空间

Step2  获得snapshot

根据情况不同自动获得snapshot level,或者调整snapshot level

Step3 创建报告

选择开始与终止的snapshot 输入文件名

使用了Statspack的脚本已经在导入了DB的环境中准备好了,只要连接到DB,就可以执行脚本

执行安装脚本

Statspack相关的操作全部都是通过执行用用户(PERFSTAT)来执行的,所以需要创建执行安装脚本的PERFSTAT用户

1.通过SQL*Plus,作为拥有SYSDBA权限的用户来连接DB

2.执行安装脚本(spcreate.sql)

# 以SYSDBA权限连接到SQL*Plus

SQL> connect sqlplus / as sysdba

# 执行安装・脚本

SQL> @$ORACLE_HOME/rdbms/admin/spcreate.sql

设定密码与表空间

设定PERFSTAT 用户的密码、在Statspack中所使用的默认表空间以及临时表空间

1.执行脚本,PERFSTAT用户的密码,默认表空间,临时表空间

#设定执行用户的密码

在perfstat_password中输入值:<输入password>

#设定默认表空间

在default_tablespace中输入值:<输入表空间名>

#设定临时表空间

在temporary_tablespace中输入值:<输入表空间名>

默认表空间推荐多设定300MB的冗余

获得snapshot

用PERFSTAT用户连接到DB,通过snapshot来获得统计信息

1.通过PERDSTAT用户执行statspack.snap

2.必要的话可以通过i_snap_level => 来设定获得信息的详细程度(level)(用户没有指定level时,以默认值的level5来获得)

#获得snapshot

SQL> execute statspack.snap(I_snap_level => 6);

l记录重复snapshot,通过在某个时间点的snapshot,作为报告来输出,可以获得特定期间内的DB统计信息

报告的创建

1.通过PERDSTAT用户来执行spreport.sql

SQL> @?/rdbms/admin/spreport.sql  #创建报告脚本を执行

~省略~Snap

Instance   DB Name   Snap Id    Snap Started               Level   Comment

————  —————  ———–  ——————————  ———  —————

orcl1         ORCL                  1    17 10月 2008 12:17            5

11    20 10月 2008 09:29             5

Specify the Begin and End Snapshot Ids

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

在begin_snap中输入值:

输入snapshot ID

指定开始、终止获得统计信息范围的时间点的snapshot ID,输出报告

1.参考Snap Id,输入起始snapshot以及终止snapshot ID

2.输入报告名

Specify the Begin and End Snapshot Ids

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#输入起始snapshot ID

请在begin_snap中输入值: <输入Snap Id例:1>

#输入终止snapshot ID

请在end_snap中输入值: <输入Snap Id例:11>

#输入 报告名

请在report_name中输入值: <输入报告名>

删除snapshot

获得的性能统计信息只要不明确地删除,无论何时都会被保留,根据不同情况可能会挤压储存区域

因此,请删除不需要的统计信息

1.通过PERFSTAT用户来执行sppurge.sql

2.指定想删除的范围的起始于终止时点,指定snapshot ID

SQL> @?/rdbms/admin/sppurge.sql   #执行删除的脚本

Specify the Lo Snap Id and Hi Snap Id range to purge

Statspack 实际的报告输入例

STATSPACK report for

Database    DB Id Instance Inst Num Startup Time Release RAC

~~~~~~~~ -------------- ------------ ------------- ----------------------- --------------

1196126054    orcl1 1 17-10月-08 11:40 11.1.0.7.0 YES

Host Name   Platform CPUs Cores Sockets Memory (G)

~~~~ ------------------------- ---------------------- ----- ----- --------- ------------ -----------------

jpintl005.jp.ora   Linux IA (32-bit) 8 8 2 4.0

Snapshot Snap Id Snap Time Sessions Curs/Sess Comment

~~~~~~~~ ---------- ---------------------------------- ------------- --------- ------------------

Begin Snap: 36 21-10月-08 19:46:15 38 1.0

End Snap: 37 21-10月-08 19:47:51 38 1.0

Elapsed: 1.60 (mins) Av Act Sess: 0.4

SQL ordered by Elapsed time for DB: ORCL Instance: orcl1 Snaps: 36 -37

-> Total DB Time (s): 42

-> Captured SQL accounts for 195.5% of Total DB Time

-> SQL reported below exceeded 1.0% of Total DB Time

Elapsed Elap per CPU Old

Time (s) Executions Exec (s) %Total Time (s) Physical Reads Hash Value

---------- ------------ ---------- ------ ---------- --------------- ----------

40.69 1 40.69 95.9 40.67 0 3417014992

Module: SQL*Plus

declare v_num number; begin for i in 1..10000 loop selec

t c1 into v_num from t1 where c1 = 100; end loop; end;

40.48 10,000 0.00 95.4 40.46 0 2968801179

Module: SQL*Plus

AWR报告是指什么

AWR(自动负载库)

从Oracle 10g开始会自动获得DB内部的统计信息(snapshot)

AWR是使得Statspack进化的功能

与Statspack相同,可以经常观察到以低负荷来创建各种报告

通过Enterprise Manager(EM),可以变更、查看设定内容

可以通过ADDM来自动进行性能减少/诊断

b68bb9bebb5d204b133a8ad3951b1aca.png

AWR在创建DB时,也会在SYSAUX表空间中创建                      -不需要安装

MMON(Memory Monitor)会定期获得SGA的信息

-默认1小时内保存1次snapshot(11g中是8天)

-想查看、变更设定内容的话,需要Oracle EM可以使用

执行自动删除旧数据

8543d367a8133c1270a2151a6c759baf.png

比较Statspack与AWR的报告

3a71f99c6a91dac128771e573df6d8a3.png

Statspack 报告的分析

分析点

吞吐量与负荷(Load Profile)

实例效率(Instance Efficiency)

待机 项目(Top-5 Timed Events)

SQL的详细信息(SQL ordered by ~)

特别是在正式环境中使用时,根据业务内容与时间段不同,所收集到的统计信息也会不同,所以我们推荐多多比较多个报告

Load Profile负荷状況的读取

伴随着磁盘访问,我们需要着眼于是否会有数据的读入、写入,在DB的处理中,找出容易成为瓶颈的物理I/O

a5ddd827143eb22d9db3ce1afd2936a7.png

Instance Efficiency实例效率.

确认DB缓冲区高速缓存命中率,确认实例是否高效运行

越接近100%就越好

参考値大于80%-% Non-Parse CPU

90%以上-Buffer Hit%、Optimal W/A Exec%、Sort Parse%

95%以上-Library Hit%、Redo Nowait%、Buffer Nowait%

100%以上-Latch Hit%

5f5b762bf98f413ae578e6ffd42bba0a.png

参数名

説明

Buffer Hit%

高速缓存中所拥有的需要的数据的比例

Library Hit %

Library cache中所拥有的需要的数据的比例

Soft Parse %

所有解析中可以重复利用的比例

In-Memory Sort%

Sort在内存中执行的比例

Latch Hit%

所有latch的命中率

Parse CPU to Parse Elapsed %

解析CPU时间/ 解析的总计时间

Execute to Parse%

因为执行SQL而没执行解析的比例

%non-parse CPU

解析之外所使用的CPU时间的比例

Buffer Nowait%

高速缓冲区中提出需求时,可以马上应用的比例

Redo Nowait%

对redo log提出需求时,可以马上应用的比例

Top-5 Timed Events待机 项目

检查实例level中待机时间前五的项目,确认监视对象的实例性能是否降低

Waits :项目待机的总次数

Time(s) :项目总计待机时间以及总计CPU时间(秒)

Avg wait(ms) : 项目平均待机时间

% Total Call Time: time for each timed event / total call time                                                 Total call time total CPU time + total wait time for non-idle events

ba52cc9c77cac265165444661729b4da.png

等待事件是什么?

进程没有使用CPU的时间

理想待机 项目(SQL的需求等待)

有瓶颈时,意味着原因并不是DB资源

其他待机 项目(SQL执行中)

DB资源(缓冲区竞争、I/O竞争、latch竞争等等)相关的待机时间

通过对SQL执行中的待机 项目与CPU使用时间进行调优 可以加快响应时间

1207259de1d5d75c36ea4498bbae01f4.png

SQL ordered by ~ SQL的处理信息

确认各SQL读入的缓冲区数以及磁盘的访问次数,确认是否使用了资源使用量较高的SQL

90caa8ecfa8f89c0e96bf9dbb902a273.png

SQL trace是什么?

使用SQL trace的话就可以获得比执行SQL执行时更详细的信息通过分析刚刚获得的信息,就可以指定出现问题的SQL

SQL trace的获得方法如下所示

1. 获得所有会话信息的方法

2. 获得指定的会话信息的方法

获得的信息中,各个SQL包含以下信息

语句的分析、执行,fetch的执行次数

CPU时间、消耗时间

物理读入(Physical read)、理论读入(Logical read)

处理的行数

SQL trace使用顺序

获得所有会话信息时

1. 设定初始化参数SQL_TRACE为TRUE

2. 重启Oracle

重启之后需要重新设定为FALSE,在重启期间,每次开始会话就都会创建追踪文件,就会输出各个会话的所有信息

仅仅获得指定应用的追踪方法

对应用中想开始SQL trace的point追加以下SQL语句

ALTER SESSION SET SQL_TRACE=TRUE;

这时,获得 trace期间,可以设定终止应用或者将SQL_TRACE设定为 FALSE

通过TKPROF进行的格式化

lSQL trace的输出结果通过使用TKPROF,可以以更加简明的形式来进行格式化

<UNIX/Linux环境中执行TKPROF的例>

TKPROF命令中orcl1_ora_12059.trc 这个trace文件,对         tkprof_1.prf进行格式化

$ tkprof orcl1_ora_12059.trc tkprof_1.prf

※ TKPROF的执行Module名由于环境不同而不同,具体请参考手册

TKPROF的输出例

80ad66267347a89b75195aaaadba2cf8.png

弄清楚是应用程序的问题还是网络问题

判断DB中的性能问题时需要调查到底是AP问题还是网络问题

Net 的 trace文件:确认通信(packet)的处理信息

Net的trace文件是指什么?

每个网络组成(listener・客户端・服务器等等)都可以在信息交换是,生成 trace信息

获得网络通信时的 trace信息,指定获得的信息交换中可能产生性能问题的地方

※listener与服务器的 trace每次连接与启动时,都会创建得比客户端量要更多的

首先我们推荐检查客户端(可能的话请检查服务器)的 trace

7023d7686fdf4bc4b18bf1dedbe8a770.png

使用trace时需要考虑的问题

1.需要充分确保磁盘空间

trace以及日志可能使用大量磁盘空间

另外,通常使得设定无效。或者定期删除日志文件,尽量不对进程增加负荷

2.输出地址文件的位置 我们不推荐所有用户来写入的swap space

3.输出地址是否具有对目录的写入权限 连接用户、oracle软件拥有者、listener启动用户来写入

注意:  trace功能中,因为使用了大量磁盘区域,可能造成系统 性能大幅降低。所以只有在必要时才能使用trace

客户端中的trace设定方法

<设定方法>

l通过客户端系统的sqlnet.ora文件来设定以下参数

TRACE_LEVEL_CLIENT

TRACE_DIRECTORY_CLIENT

TRACE_UNIQUE_CLIENT

8.0.6 以后会记录以下参数

TRACE_TIMESTAMP_CLIENT

通过上述设定之后,客户端每次新建连接时都会在指定目录中生成trace文件

XXX.trc 这个文件,只要在 trace子目录中输出了的话就成功了

获得客户端的trace相关的注意事项

<获得方法>

通过Oracle Net Services 11g (11.1.0) 将默认的 trace输出地址设定为Automatic Diagnostic Repository (ADR)

为了在通过TRACE_DIRECTORY_CLIENT指定的目录中输出,可以指定以下参数

默认为$ORACLE_HOME/log/diag

sqlnet.ora

DIAG_ADR_ENABLED=OFF

<参考>服务器的 trace也与客户端的情况相同                       listener的 trace的情况如下所示

listener.ora

DIAG_ADR_ENABLED_<listener名>=OFF

tracelevel

设定通过TRACE_LEVEL_CLIENT获得的信息

正常运行时,一般为0或者OFF(默认),参考下列表,根据需求变更level

trace level

収集数据

0或者OFF

没有trace的输出

4或者USER

用户・trace信息

10或者ADMIN

管理trace信息

16或者SUPPORT

Cluster支持・trace信息

客户端的trace文件获得例

XXX.trc 这个文件是在trace子目录中输出了的话就成功

[21-JUN-2006 10:58:29:081] nscon: doing connect handshake…

[21-JUN-2006 10:58:29:081] nscon: sending NSPTCN packet

[21-JUN-2006 10:58:29:081] nspsend: entry

[21-JUN-2006 10:58:29:081] nspsend: plen=242, type=1

[21-JUN-2006 10:58:29:081] nttwr: entry

[21-JUN-2006 10:58:29:081] nttwr: socket 288 had bytes written=242

[21-JUN-2006 10:58:29:081] nttwr: exit

[21-JUN-2006 10:58:29:081] nspsend: 242 bytes to transport

[21-JUN-2006 10:58:29:081] nspsend: packet dump

[21-JUN-2006 10:58:30:081] nsprecv: 00 CD 00 00 06 00 00 00 |……..|

[21-JUN-2006 10:58:30:081] nsprecv: 00 00 08 00 01 00 00 00 |……..|

[21-JUN-2006 10:58:30:082] nsprecv: 0C 0C 41 55 54 48 5F 53 |..AUTH_S|

[21-JUN-2006 10:58:30:082] nsprecv: 45 53 53 4B 45 59 00 00 |ESSKEY..|

[21-JUN-2006 10:58:30:082] nsprecv: 32 37 46 32 45 38 39 36 |27F2E896|

分析的基本思路

[21-JUN-2006 10:58:30:081] nsprecv: 00 CD 00 00 06 00 00 00 |……..|

分析数据・packet的收发信息所花费的时间

fff29d7e353917cb56dd90deeed769c0.png

性能问题的区分①应用程序的问题例

客户端中的nsprecv(收信息)到nspsend(发信息)所花费的时间

ad1af982500fc58c973df074d38a0046.png

性能问题的区分②DB中的问题例

客户端中的nspsend(发信息)到nsprecv(收信息)所花费的时间

90badfb5a8dac744751e8047a1982e40.png

性能问题的区分例③N/W的问题例

客户端中的nspsend(发信息)到nsprecv(收信息)为止,似乎没有等待时机,考虑到处理内容,收发信息的时间也花费太多了。

ac0ec70de6b393efb4f5c38efdb4f51b.png

数据库调优

参考分析中使用过的信息,执行合适的调优

SQL调优

索引

提示HINT

使用ADDM的调优

使用各个建议的调优

确认效果

确认使用了AUTOTRACE的调优效果

索引调优 例

Statspack的SQL ordered by Gets的确认

2af39db90c8ce4bc859b43751e17ff1e.png

索引的创建与删除

索引的创建

SQL> create index c1_index on t1(c1);

索引的删除

SQL> drop index c1_index;

即使建索引了,也会在下列情况中进行全表扫描,请大家注意

搜索NULL值

计算索引列

隐秘地变更数据类型

使用LIKE语句的中间一致、后方一致搜索

使用!=和<>

索引的效果

655527355796a264138ae951e1d2ca51.png

提示HINT的使用

通过使用提示HINT,就会用到指定的访问路径,可以在优化中进行指定

<例>

指定使用合适的索引(Index)

指定合适的表结合方法以及结合顺序

指定CBO的目标(重视吞吐量或者面向 OLTP等) etc.

提示HINT的使用例 ( 在/*+ 与 */之间指定提示HINT、直接嵌入到SQL中 )

(例)就会使用表t1的c1列中附加的c1_indx这个Index

SQL>select /*+INDEX(t1 c1_index) */ * from where c1=100;

ADDM自动数据库检测监视器(AutomaticDatabaseDiagnosticsMonitor)

基于AWR中所示收集的统计信息,定期监视、诊断性能的,面向DB管理者(DBA)的功能

737dfa61e05d4c67ca47fac9a160eadb.png

帮助功能

5d6ee32c325adfe0c97cfdc316726c8b.png

SQL调优・帮助

诊断因为高负荷而发生问题的SQL语句以及执行计划

以诊断为基础给予建议

55dd86509f85e589c7a6a9b3b2e6178d.png

调优的流程

ed6d094e42495e33bd0cb615ff677722.png

确认调优效果

随着SQL语句变得复杂,调优方法也越来越多,可能为了达到目标效果需要

反复调优,如果使用SQL*Plus的AUTOTRACE功能的话就能当即确认效果了

l要使用AUTOTRACE的话需要确认一下几条项目

lSQL*Plus中执行的SQL语句

执行计划的结果

统计信息

-物理读入  -論理读入

-REDO尺寸  -内存sort 尺寸

-处理件数  -磁盘sort 尺寸

AUTOTRACE功能的设定顺序

lAUTOTRACE的设定顺序如下所示

Step1 创建PLUSTRACE 角色(仅限首次)

SQL> connect sqlplus / as sysdba

SQL> @$ORACLE_HOME/sqlplus/admin/plustrce.sql

Step2  对使用用户赋予已创建的PLUSTRACE角色

SQL> grant plustrace to <用户名>

Step3 通过使用用户创建AUTOTRACE功能将要使用的工作用的表

SQL> @$ORACLE_HOME/sqlplus/admin/utlxplan.sql

每个想使用AUTOTRACE功能的用户都需要重复Step2与Step3

AUTOTRACE的获得

1.通过使用用户执行SET AUTOTRACE命令

SQL> set autotrace on

2.SQL执行

SQL> select * from t1 where c1 = 100;

※想终止AUTOTRACE功能时

SQL> set autotrace off

AUTOTRACE的获得的例子

b7151f76354bcde3bc6540648ec9c307.png

总结

e00246adeda19e6cc03eb5c496764dab.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值