Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1828120
  • 博文数量: 323
  • 博客积分: 5970
  • 博客等级: 大校
  • 技术积分: 2764
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-03 23:13
文章分类

全部博文(323)

文章存档

2018年(2)

2017年(11)

2016年(10)

2015年(27)

2014年(2)

2013年(30)

2012年(197)

2011年(44)

分类: Oracle

2012-05-03 18:41:56

Oracle 10g AWR 报告分析


转自:http://space.itpub.net/35489/viewspace-604963

1.1.1.ordered by Elapsed Time:

   记录了执行总和时间的TOP SQL(请注意是监控范围内该SQL的执行时间总和,而不是单次SQL执行时间ElapsedTime= CPUTime+Wait Time)。

SQL ordered by Elapsed Time

  • Resources reported for PL/SQL code includes the resources used by all SQL statements called by the code.
  • % Total DB Time is the Elapsed Time of the SQL statement divided into the Total Database Time multiplied by 100

Elapsed Time (s)

CPU Time (s)

Executions

Elap per Exec (s)

% Total DB Time

SQL Id

SQL Module

SQL Text

152,148

150,929

205,218

0.74

24.22

 

update SYS.AUD$ set XID = :1 w...

109,969

109,032

2,003

54.90

17.50

 

DECLARE job BINARY_INTEGER := ...

38,797

38,460

8,843

4.39

6.17

 

DECLARE job BINARY_INTEGER := ...

29,312

13,414

10

2931.15

4.67

 

BEGIN CS_SLT_DSCLJG(:1, :2, :3...

 

  Elapsed Time(S): SQL语句执行用总时长,此排序就是按照这个字段进行的。注意该时间不是单个SQL跑的时间,而是监控范围内SQL执行次数的总和时间。单位时间为秒。ElapsedTime= CPUTime+Wait Time

  CPU Time(s): 为SQL语句执行时CPU占用时间总时长,此时间会小于等于Elapsed Time时间。单位时间为秒。

 Executions: SQL语句在监控范围内的执行次数总计。

 Elap per Exec(s):执行一次SQL的平均时间。单位时间为秒。

 % Total DB Time: 为SQL的Elapsed Time时间占总时间的百分比。

 SQL ID:SQL语句的ID编号,点击之后就能导航到下边的SQL详细列表中,点击IE的返回可以回到当前SQL ID的地方。

 SQL Module: 显示该SQL是用什么方式连接到数据库执行的,如果是用SQL*Plus或者PL/SQL链接上来的那基本上都是有人在调试程序。一般用前台应用链接过来执行的sql该位置为空。

 SQL Text:简单的sql提示,详细的需要点击SQL ID。

 

1.1.2.SQL ordered by CPU Time:

 记录了执行占CPU时间总和时间最长的TOP SQL(请注意是监控范围内该SQL的执行占CPU时间总和,而不是单次SQL执行时间)。

1.1.3.SQL ordered by Gets:

 记录了执行占总buffer gets(逻辑IO)的TOP SQL(请注意是监控范围内该SQL的执行占Gets总和,而不是单次SQL执行所占的Gets).

 

1.1.4.SQL ordered by Reads:

记录了执行占总磁盘物理读(物理IO)的TOP SQL(请注意是监控范围内该SQL的执行占磁盘物理读总和,而不是单次SQL执行所占的磁盘物理读)。

 

1.1.5.SQL ordered by Executions:

 记录了按照SQL的执行次数排序的TOP SQL。该排序可以看出监控范围内的SQL执行次数。

 

1.1.6.SQL ordered by Parse Calls:

 记录了SQL的软解析次数的TOP SQL。

 说到软解析(soft prase)和硬解析(hard prase),就不能不说一下对sql的处理过程。当你发出一条sql语句交付Oracle,在执行和获取结果前,Oracle对此sql将进行几个步骤的处理过程:

  1、语法检查(syntax check)

  检查此sql的拼写是否语法。

  2、语义检查(semantic check)

  诸如检查sql语句中的访问对象是否存在及该用户是否具备相应的权限。

  3、对sql语句进行解析(prase)

  利用内部算法对sql进行解析,生成解析树(parse tree)及执行计划(execution plan)。

  4、执行sql,返回结果(execute and return)

  其中,软、硬解析就发生在第三个过程里。

  Oracle利用内部的hash算法来取得该sql的hash值,然后在library cache里查找是否存在该hash值;

  假设存在,则将此sql与cache中的进行比较;

  假设“相同”,就将利用已有的解析树与执行计划,而省略了优化器的相关工作。这也就是软解析的过程。

  诚然,如果上面的2个假设中任有一个不成立,那么优化器都将进行创建解析树、生成执行计划的动作。这个过程就叫硬解析。

  创建解析树、生成执行计划对于sql的执行来说是开销昂贵的动作,所以,应当极力避免硬解析,尽量使用软解析。这就是在很多项目中,倡导开发人员对功能相同的要努力保持代码的一致性,以及要在程序中多使用绑定变量的原因。

/****************************************************/

大家都在说在Sql中使用了Bind Var(绑定变量)会提高不少性能,那他到底是如何提高性能的呢?

使用了Bind Var能提高性能主要是因为这样做可以尽量避免不必要的硬分析(Hard Parse)而节约了时间,同时节约了大量的CPU资源。

当 一个Client提交一条Sql给Oracle后,Oracle首先会对其进行解析(Parse),然后将解析结果提交给优化器(Optimiser)来 进行优化而取得Oracle认为的最优的Query Plan,然后再按照这个最优的Plan来执行这个Sql语句(当然在这之中如果只需要软解析的话会少部分步骤)。

但 是,当Oracle接到Client提交的Sql后会首先在共享池(Shared Pool)里面去查找是否有之前已经解析好的与刚接到的这一个Sql完全相同的Sql(注意这里说的是完全相同,既要求语句上的字符级别的完全相同,又要 求涉及的对象也必须完全相同)。当发现有相同的以后解析器就不再对新的Sql在此解析而直接用之前解析好的结果了。这里就节约了解析时间以及解析时候消耗 的CPU资源。尤其是在OLTP中运行着的大量的短小Sql,效果就会比较明显了。因为一条两条Sql的时间可能不会有多少感觉,但是当量大了以后就会有 比较明显的感觉了。

上面说到了硬解析(Hard Parse),那这个Hard Parse到底是个啥呢?

Parse主要分为三种:

1、Hard Parse (硬解析)

2、Soft Parse (软解析)

3、Soft Soft Parse(好像有些资料中并没有将这个算在其中)

Hard Parse就是上面提到的对提交的Sql完全重新从头进行解析(当在Shared Pool中找不到时候将会进行此操作),总共有一下5个执行步骤:

1:语法分析

2:权限与对象检查

3:在共享池中检查是否有完全相同的之前完全解析好的—如果存在,直接跳过4和5,运行Sql(此时算soft parse)

4:选择执行计划

5:产生执行计划

Soft Parse就如果是在Shared Pool中找到了与之完全相同的Sql解析好的结果后会跳过Hard Parse中的后面的两个步骤。

Soft Soft Parse实际上是当设置了session_cursor_cache这个参数之后,Cursor被直接Cache在当前Session的PGA中的,在 解析的时候只需要对其语法分析、权限对象分析之后就可以转到PGA中查找了,如果发现完全相同的Cursor,就可以直接去取结果了,也就就是实现了 Soft Soft Parse。

不过在计算解析次数的时候是只计算Hard Parse和Soft Parse的(其实Soft Soft Parse好像也并不能算是做了Parse ):

Soft Parse百分比计算:Round(100*(1-:hprs/:prse),2) [hprs:硬解析次数;prse:解析次数]

Parse比率计算: Round(100*(1-prse/exec) ,2) [exec:执行次数]

  软解析过多的意思就是说session_cursor_cache的数值有可能小了,一些频繁调用的SQL在Cache中找不到相同的Cursor。

 

1.1.7.SQL ordered by Sharable Memory:

 记录了SQL占用library cache的大小的TOP SQL。

Sharable Mem (b):占用library cache的大小。单位是byte。

 

1.1.8.SQL ordered by Version Count:

 记录了SQL的打开子游标的TOP SQL。

 在 硬解析的过程中,进程会一直持有library cach latch,直到硬解析结束。硬解析结束以后,会为该SQL产生两个游标,一个是父游标,另一个是子游标。父游标里主要包含两种信息:SQL文本以及优化 目标(optimizer goal)。父游标在第一次打开时被锁定,直到其他所有的session都关闭该游标后才被解锁。当父游标被锁定的时候是不能被交换出library cache的,只有在解锁以后才能被交换出library cache,这时该父游标对应的所有子游标也被交换出library cache。子游标包括游标所有的信息,比如具体的执行计划、绑定变量等。子游标随时可以被交换出library cache,当子游标被交换出library cache时,oracle可以利用父游标的信息重新构建出一个子游标来,这个过程叫reload。可以使用下面的方式来确定reload的比率:
SELECT 100*sum(reloads)/sum(pins) Reload_Ratio FROM v$librarycache;
一 个父游标可以对应多个子游标。子游标具体的个数可以从v$sqlarea的version_count字段体现出来。而每个具体的子游标则全都在 v$sql里体现。当具体的绑定变量的值与上次的绑定变量的值有较大差异(比如上次执行的绑定变量的值的长度是6位,而这次执行的绑定变量的值的长度是 200位)时或者当SQL语句完全相同,但是所引用的对象属于不同的schema时,都会创建一个新的子游标

 

1.1.9.SQL ordered by Cluster Wait Time:

 记录了集群的等待时间的TOP SQL

 

1.2. 其他员相关问题解析:1.2.1.Load Profile

 

Per Second

Per Transaction

Redo size:

65,768.90

17,459.39

Logical reads:

31,757.56

8,430.54

Block changes:

271.06

71.96

Physical reads:

188.86

50.13

Physical writes:

11.90

3.16

User calls:

197.15

52.34

Parses:

241.40

64.08

Hard parses:

1.90

0.50

Sorts:

12.46

3.31

Logons:

0.15

0.04

Executes:

313.88

83.32

Transactions:

3.77

 

 

% Blocks changed per Read:

0.85

Recursive Call %:

95.92

Rollback per transaction %:

30.79


阅读(1429) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~