三思笔记动态性能视图_第1页
三思笔记动态性能视图_第2页
三思笔记动态性能视图_第3页
三思笔记动态性能视图_第4页
三思笔记动态性能视图_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学习动态性能表

第一篇"v$sysstat2007.5.23

按照OracleDocument中的描述,v$sysstat存储自数据库实例运行那刻起就开始

累计全实例(instance-wide的资源使用情况。

类似于v$sesstat,该视图存储下列的统计信息:

1>.事件发生次数的统计(如:usercommits

2〉.数据产生,存取或者操作的total列(如:redosize

3>.如果TIMED_STATISTICS值为true,则统计花费在执行操作上的总时间

(如:CPUusedbythissession

v$sysstat视图常用列介绍:

•STATISTIC#:标识

•NAME:统计项名称

•VALUE:资源使用量

该视图还有一列class-统计类别但极少会被使用,各类信息如下:

1代表事例活动

2代表Redobuffer活动

4代表锁

8代表数据缓冲活动

16代表OS活动

32代表并行活动

64代表表访问

128代表调试信息

注意Statistic#的值在不同版本中各不相同,使用时要用Name做为查询条件而

不要以statistic#的值做为条件。

使用v$sysstat中的数据

该视图中数据常被用于监控系统性能。如buffercache命中率、软解析率等都

可从该视图数据计算得出。

该视图中的数据也被用于监控系统资源使用情况,以及系统资源利用率的变

化。正因如此多的性能数据,检查某区间内系统资源使用情况可以这样做,在一个

时间段开始时创建一个视图数据快照,结束时再创建一个,二者之间各统计项值的不

同(endvalue-beginvalue即是这一时间段内的资源消耗情况。这是oracle工具的

常用方法,诸如Statspack以及BSTAT/ESTAT都是如此。

为了对比某个区间段的数据,源数据可以被格式化(每次事务,每次执行,每秒钟

或每次登陆,格式化后数据更容易从两者中鉴别出差异。这类的对比在升级前,升级

后或仅仅想看看一段时间内用户数量增长或数据增加如何影响资源使用方面更加

实用。

你也可以使用v$sysstat数据通过查询v$system_event视图来检查资源消耗和

资源回收。

V$SYSSTAT中的常用统计

V$SYSSTAT中包含多个统计项,这部分介绍了一些关键的v$sysstat统计项,在

调优方面相当有用。下列按字母先后排序:

数据库使用状态的一些关键指标:

•CPUusedbythissession:所有session的cpu占用量,不包括后台进程。这项统

计的单位是百分之x秒.完全调用一次不超过10ms

•dbblockchanges:那部分造成SGA中数据块变化的insert,update或delete操作

数这项统计可以大概看出整体数据库状态。在各项事务级别,这项统计指出脏缓存

比率。

•executecount:执行的sql语句数量(包括递归sql

•logonscurrent:当前连接到实例的Sessions。如果当前有两个快照则取平均

值。・logonscumulative:自实例启动后的总登陆次数。

•parsecount(hard:在sharedpool中解析调用的未命中次数。当sql语句执行并

且该语句不在sharedpool或虽然在sharedpool但因为两者存在部分差异而不能被

使用时产生硬解析。如果一条sql语句原文与当前存在的相同,但查询表不同则认

为它们是两条不同语句,则硬解析即会发生。硬解析会带来cpu和资源使用的高昂

开销,因为它需要oracle在sharedpool中重新分配内存,然后再确定执行计划,最终语

句才会被执行。

•parsecount(tota上解析调用总数,包括软解析和硬解析。当session执行了一条

sql语句,该语句已经存在于sharedpool并且可以被使用则产生软解析。当语句被

使用(即共享所有数据相关的现有sql语句(如最优化的执行计划必须同样适用于

当前的声明。这两项统计可被用于计算软解析命中率。

•parsetimecpu:总cpu解析时间(单位:10ms。包括硬解析和软解析。

•parsetimeelapsed:完成解析调用的总时间花费。

•physicalreads:OSblocksread数。包括插入到SGA缓存区的物理读以及PGA

中的直读这项统计并非V。请求数。

•physicalwrites:从SGA缓存区被DBWR写到磁盘的数据块以及PGA进程直

写的数据块数量。

•redologspacerequests:在redologs中服务进程的等待空间,表示需要更长时间

的logswitch。

•redosize:redo发生的总次数(以及因此写入logbuffer,以byte为单位。这项统

计显示出update活跃性。

•sessionlogicalreads:逻辑读请求数。

•sorts(memoryandsorts(disk:sorts(memory是适于在SORT_AREA_SIZE(因此

不需要在磁盘进行排序的排序操作的数量。sorts(disk则是由于排序所

需空间太大,SORT_AREA_SIZE不能满足而不得不在磁盘进行排序操作的数

量。这两项统计通常用于计算in-memorysortratioo

•sorts(rows:列排序总数。这项统计可被'sorts(total统计项除尽以确定每次排

序的列。该项可指出数据卷和应用特征。

•tablefetchbyrowid:使用ROWID返回的总列数(由于索弓I访问或sql语句中

使用了'whererowid=&rowid'而产生

•tablescans(rowsgotten:全表扫描中读取的总列数

•tablescans(blocksgotten:全表扫描中读取的总块数,不包括那些split的列。

•usercommits+userrollbacks:系统事务起用次数。当需要计算其它统计中每

项事务比率

时该项可以被做为除数。例如,计算事务中逻辑读,可以使用下列公式:session

logicalreads/(usercommits+userrollbackso

注SQL语句的解析有软解析softparse与硬解析hardparse之说,以下是5个步

骤:1:语法是否合法(sql写法

2:语义是否合法(权限,对象是否存在

3:检查该sql是否在共享池中存在

-如果存在,直接跳过4和5,运行sql.此时算softparse

4:选择执行计划

5:产生执行计划

-如果5个步骤全做,这就叫hardparse.

注意物理I/O

oracle报告物理读也许并未导致实际物理磁盘I/O操作。这完全有可能因为多

数操作系统都有缓存文件,可能是那些块在被读取。块也可能存于磁盘或控制级缓

存以再次避免实际I/。。Oracle报告有物理读也许仅仅表示被请求的块并不在缓存

中。

由V$SYSSTAT得出实例效率比(InstanceEfficiencyRatios

下列是些典型的instanceefficiencyratios由v$sysstat数据计算得来,每项比率

值应该尽可能接近1:

•Buffercachehitratio:该项显示buffercache大小是否合适。

公式:1-((physicalreads-physicalreadsdirect-physicalreadsdirect(lob/session

logicalreads执行:

select1-((a.value-b.value-c.value/d.value

fromv$sysstata,v$sysstatb,v$sysstatc,v$sysstatd

where='physicalreads'and

=,physicalreadsdirect'and

='physicalreadsdirect(lob'and

='sessionlogicalreads*;

•Softparseratio:这项将显示系统是否有太多硬解析。该值将会与原始统计数据

对比以确保精确。例如,软解析率仅为0.2则表示硬解析率太高。不过,如果总解析

量(parsecounttotal偏低,这项值可以被忽略。

公式:1-(parsecount(hard/parsecount(total

执行:

select1-(a.value/b.value

fromv$sysstata,v$sysstatb

Wherea.name=,parsecount(hard'andb.name=,parsecount(total*;

•In-memorysortratio:该项显示内存中完成的排序所占比例。最理想状态下,在

OLTP系统中,大部分排序不仅小并且能够完全在内存里完成排序。

公式:sorts(memory/(sorts(memory+sorts(disk

执行:

selecta.value/(b.value+c.value

fromv$sysstata,v$sysstatb,v$sysstatc

where=,sorts(memory'and

='sorts(memory*andc.name=*sorts(disk,;

•Parsetoexecuteratio:在生产环境,最理想状态是一条sql语句一次解析多数运

行。公式:1-(parsecount/executecount

执行:

select1-(a.value/b.value

fromv$sysstata,v$sysstatb

where='parsecount(totaFand='executecount;

•ParseCPUtototalCPUratio:该项显示总的CPU花费在执行及解析上的比

率。如果这项比率较低,说明系统执行了太多的解析。

公式:1-(parsetimecpu/CPUusedbythissession

执行:

select1-(a.value/b.value

fromv$sysstata,v$sysstatb

where='parsetimecpu'and

='CPUusedbythissession*;

•ParsetimeCPUtoparsetimeelapsed:通常,该项显示锁竞争比率。这项比率计

算是否时间花费在解析分配给CPU进行周期运算(即生产工作。解析时间花费不

在CPU周期运算通常表示由于锁竞争导致了时间花费

公式:parsetimecpu/parsetimeelapsed

执行:

selecta.value/b.value

fromv$sysstata,v$sysstatb

where='parsetimecpu'and=,parsetimeelapsed*;从V$SYSSTAT

获取负载间档(LoadProfile数据

负载间档是监控系统吞吐量和负载变化的重要部分,该部分提供如下每秒和每

个事务的统计信息:logonscumulative,parsecount(total,parsecount(hard,executes,

physicalreads,physicalwrites,blockchanges,andredosize.

被格式化的数据可检查‘rates,是否过高,或用于对比其它基线数据设置为识别

systemprofile在期间如何变化。例如,计算每个事务中blockchanges可用如下公式:

dbblockchanges/(usercommits+userrollbacks

执行:

selecta.value/(b.value+c.value

fromv$sysstata,v$sysstatb,v$sysstatc

where='dbblockchangesfand

='usercommits*andc.name='userrollbacks1;

其它计算统计以衡量负载方式,如下:

•Blockschangedforeachread:这项显示出blockchanges在blockreads中的比

例。它将指出是否系统主要用于只读访问或是主要进行诸多数据操作

(如:inserts/updates/deletes公式:dbblockchanges/sessionlogicalreads

执行:

selecta.value/b.value

fromv$sysstata,v$sysstatb

where='dbblockchanges'and

='sessionlogicalreads*;

•Rowsforeachsort:

公式:sorts(rows/(sorts(memory+sorts(disk

执行:

selecta.value/(b.value+c.value

fromv$sysstata,v$sysstatb,v$sysstatc

where=,sorts(rows'and

='sorts(memory*andc.name=*sorts(disk,;

学习动态性能表

第二篇-(l-v$sesstat2007.5.25

按照OracleOnlineBook中的描述,v$sesstat存储session从login到logout的详

细资源使用统计。

类似于v$sysstat,该视图存储下列类别的统计:

•事件发生次数的统计,如用户提交数。

•数据产生,存取或者操作的total歹[I(如:redosize

•执行操作所花费的时间累积,例如sessionCPU占用(如果

TIMED_STATISTICS值为true

注意:

如果初始参数STATISTICS_LEVEL被设置为TYPICAL或ALL,时间统计被

数据库自动收集如果STATISTICS_LEVEL被设置为BASIC,你必须设置

TIMED_STATISTICS值为TRUE以打开收集功能。

如果你已设置了DB_CACHE_ADVICE,TIMED_STATISTICS或

TIMED_OS_STATISTICS,或在初始参数文件或使用ALTER_SYSTEM或ALTER

SESSION,那么你所设定的值的值将覆盖STATISTICS_LEVEL的值。

v$sysstat和v$sesstat差别如下:

□v$sesstat只保存session数据,而v$sysstat则保存所有sessions的累积值。

Uv$sesstat只是暂存数据,session退出后数据即清空。v$sysstat则是累积的,只

有当实例被shutdown才会清空。

口v$sesstat不包括统计项名称,如果要获得统计项名称则必须与v$sysstat或

v$statname连接查询获得。

v$sesstat可被用于找出如下类型session:

□高资源占用

」高平均资源占用比(登陆后资源使用率

□默认资源占用比(两快照之间

在V$SESSTAT中使用统计

多数v$sesstat中的统计参考是v$sysstat描述的子集,包括sessionlogicalreads,

CPUusedbythissession,dbblockchanges,redosize,physicalwrites,parsecount(hard,

parsecount(total,sorts(memory,andsorts(disk.

V$SESSTAT常用列说明

USID:session唯一ID

□STATISTIC#:资源唯一ID

□VALUE:资源使用

示例1:下列找出当前session中最高的logical和PhysicalI/O比率.

下列SQL语句显示了所有连接到数据库的session逻辑、物理读比率(每秒。

logical和physicalI/O比率是通过自登陆后的时间消耗计算得出。对于sessions连

接到数据库这种长周期操作而言也许不够精确,不过做个示例却足够了。

先获得session逻辑读和物理读统计项的STATISTIC#直

SELECTname,statistic#

FROMV$STATNAME

WHEREnameIN('sessionlogicalreads','physicalreads';

NAMESTATISTIC#

sessionlogicalreads9

physicalreads40

通过上面获得的STATISTIC#值执行下列语句:

SELECTses.sid

,DECODE(ses.action,NULL,'onlineYbatch1"User"

,MAX(DECODE(sta.statistic#,9,sta.value,0

/greatest(3600*24>H(sysdate-ses.logon_tinie,1"LogIO/s"

,MAX(DECODE(sta.statistic#,40,sta.value,0

/greatest(3600*24*(sysdate-ses.logon_time,l"PhyIO/s"

,60*24*(sysdate-ses.logon_time"Minutes"

FROMV$SESSIONses

,V$SESSTATsta

WHEREses.status='ACTIVE1

ANDsta.sid=ses.sid

ANDsta.statistic#IN(9,40

GROUPBYses.sid,ses.action,ses.logon_time

ORDERBY

SUM(DECODE(sta.statistic#,40,lOO*sta.value,sta.value

/greatest(3600*24*(sysdate-ses.logon_time,lDESC;

SIDUserLogIO/sPhyIO/SMinutes

1951batch291257.31

470online6,16162.90

730batch7,56843.2197

2153online1,48298.910

2386batch7,62035.635

1815batch7,50335.526

1965online4,87942.919

1668online4,31844.51

1142online95569.235

1855batch57370.58

1971online1,13856.61

1323online3,26332.45

1479batch2,85735.13

421online1,32246.815

2405online25850.48

示例2:又例如通过v$sesstat和v$statname连接查询某个SID各项信息。

selecta.*,

fromv$sesstata,v$statnameb

wherea.sid=10anda.statistic#=b.statistic#;

第二篇-(2-v$mystat2007.6.8

本视图是v$sesstat的一个子集,返回当前session的统计项。当通过触发器审计

session资源使用,可以使用v$mystat来捕获资源使用,这将比直接扫描v$sesstat的列

要节省资源的多。

学习动态性能表

第三篇-(l-v$sql2007.5.25

V$SQL中存储具体的SQL语句。

一条语句可以映射多个cursor,因为对象所指的cursor可以有不同用户(如例

1o如果有多个cursor(子游标存在,在V$SQLAREA为所有cursor提供集合信息。

例1:

这里介绍以卜childcursor

userA:select*fromtbl

userB:select*fromtbl

大家认为这两条语句是不是一样的啊,可能会有很多人会说是一样的,但我告诉你不一

定,那为什么呢?

这个tblA看起来是一样的,但是不一定哦,一个是A用户的,一个是B用户的,这时

他们的执行计划分析代码差别可能就大了哦,改下写法大家就明白了:

select*fromA.tbl

select*fromB.tbl

在个别cursor上,v$sql可被使用。该视图包含cursor级别资料。当试图定位

session或用户以分析cursor时被使用。

PLAN_HASH_VALUE列存储的是数值表示的cursor执行计划。可被用来对

比执行计划。PLAN一HASH一VALUE让你不必一行一行对比即可轻松鉴别两条执

行计划是否相同。

V$SQL中的列说明:

•SQL_TEXT:SQL文本的前1000个字符

•SHARABLE_MEM:占用的共享内存大小(单位:byte

•PERSISTENT_MEM:生命期内的固定内存大小(单位:byte

•RUNTIME_MEM:执行期内的固定内存大小

•SORTS:完成的排序数

•LOADED_VERSIONS:显示上下文堆是否载入1是0否

•OPEN_VERSIONS:显示子游标是否被锁,1是0否

•USERSJ3PENING:执行语句的用户数

•FETCHES:SQL语句的fetch数。

•EXECUTIONS:自它被载入缓存库后的执行次数

•USERS_EXECUTING:执行语句的用户数

•LOADS:对象被载入过的次数

•FIRST_LOAD_TIME:初次载入时间

•INVALIDATIONS:无效的次数

•PARSE_CALLS:解析调用次数

•DISK_READS:读磁盘次数

•BUFFER_GETS:读缓存区次数

•ROWS_PROCESSED:解析SQL语句返回的总列数

•COMMANDJYPE:命令类型代号

•OPTIMIZERMODE:SQL语句的优化器模型

•OPTIMIZER_COST:优化器给出的本次查询成本

•PARSING_USER_ID:第一个解析的用户ID

•PARSING_SCHEMA_ID:第一个解析的计划ID

•KEPT_VERSIONS:指出是否当前子游标被使用DBMS_SHARED_POOL包标

记为常驻内存

•ADDRESS:当前游标父句柄地址

•TYPE_CHK_HEAP:当前堆类型检查说明

•HASH_VALUE:缓存库中父语句的Hash值

•PLAN_HASH_VALUE:数值表示的执行计划。

•CHILDNUMBER:子游标数量

•MODULE:在第一次解析这条语句是通过调用

DBMS_APPLICATION_INFO.SET_MODULE设置的模块名称。

•ACTION:在第一次解析这条语句是通过调用

DBMS_APPLICATION」NFO.SET_ACTION设置的动作名称。

•SERIALIZABLEABORTS:事务未能序歹U化次数

•OUTLINE_CATEGORY:如果outline在解释cursor期间被应用,那么本列将显

示出outline各类,否则本列为空

•CPU_TIME:解析/执行/取得等CPU使用时间(单位,毫秒

•ELAPSED_TIME:解析/执行/取得等消耗时间(单位,毫秒

•OUTLINESID:outlinesession标识

•CHILD_ADDRESS:子游标地址

•SQLTYPE:指出当前语句使用的SQL语言版本

•REMOTE:指出是否游标是一个远程映象(Y/N

•OBJECTSTATUS:对象状态(VALIDorINVALID

•IS_OBSOLETE:当子游标的数量太多的时候,指出游标是否被废弃(Y/N

第三篇-(2-V$SQL_PLAN2007.5.28

本视图提供了一种方式检查那些执行过的并且仍在缓存中的cursor的执行计

划。通常,本视图提供的信息与打印出的EXPLAINPLAN非常相似,不过,

EXPLAINPLAN显示的是理论上的计划,并不一定在执行的时候就会被使用,但

V$SQL_PLAN中包括的是实际被使用的计划。获自EXPLAINPLAN语句的执行

计划跟具体执行的计划可以不同,因为cursor可能被不同的session参数值编译(如,

HASH_AREA_SIZEO

V$SQL_PLAN中数据可以:

•确认当前的执行计划

•鉴别创建表索引效果

•寻找cursor包括的存取路径(例如,全表查询或范围索引查询

•鉴别索弓I的选择是否最优

•决定是否最优化选择的详细执行计划(如,nestedloopsjoin如开发者所愿。

本视图同时也可被用于当成一种关键机制在计划对比中。计划对比通常用于

下列各项发生改变时:

•删除和新建索引

•在数据库对象上执行分析语句

•修改初始参数值

•从rule-based切换至cost-based优化方式

•升级应用程序或数据库到新版本之后

如果之前的计划仍然在(例如,从V$SQL_PLAN选择出记录并保存到oracle表

中供参考,那么就有可能去鉴别一条SQL语句在执行计划改变后性能方面有什么

变化。

泞意:

Oracle公司强烈推荐你使用DBMS_STATS包而非ANALYZE收集优化统计.该包可以让你

平行地搜集统计项,收集分区对象(partitionedobjects)的全集统计,并且通过其它方式更好

的调整你的统计收集方式。此处,cost-based优化器将最终使用被DBMS_STATS收集的统

计项。浏览Oracle9iSuppliedPL/SQL包和类型参考以获得关于此包的更多信息。

不过,你必须使用ANALYZE语句而非DBMS_STATS进行统计收纵不涉及cost-based优

化器,就像:

•使用VALIDATE或LISTCHAINEDROWS/句

,在freelistblocks上收集信息.

V$SQL_PLAN中的常用列:

除了一些新加列,本视图几乎包括所有的PLANJTABLE歹1那些同样存在于

PLAN_TABLE中的列拥有相同的值:

•ADDRESS:当前cursor父句柄位置

•HASH_VALUE:在librarycache中父语句的HASH值。

ADDRESS和HASH_VALUE这两列可以被用于连接v$sqlarea查询cursor­

specific信息。・CHILD_NUMBER:使用这个执行计划的子cursor数

歹UADDRESS,HASH_VALUE以及CHILD_NUMBER可被用于连接v$sql查询

子cursor信息。.OPERATION:在各步骤执行内部操作的名称,例如:TABLE

ACCESS

•OPTIONS:描述歹UOPERATION在操作上的变种,例如:FULL

•OBJECT_NODE:用于访问对象的数据库链接databaselink的名称对于使用并

行执行的本地查询该列能够描述操作中输出的次序。

•OBJECT#:表或索弓I对象数量

•OBJECT_OWNER:对于包含有表或索引的架构schema给出其所有者的名称

•OBJECTNAME:表或索弓|名

•OPTIMIZER:执行计划中首列的默认优化模式;例如,CHOOSE。比如业务是

个存储数据库,它将告知是否对象是最优化的。

•ID:在执行计划中分派到每一步的序号。

•PARENT_ID:对ID步骤的输出进行操作的下一个执行步骤的ID。

•DEPTH:业务树深度(或级。

•POSITION:对于具有相同PARENT_ID的操作其相应的处理次序。

•COST:cost-based方式优化的操作开销的评估,如果语句使用rule-based方式,

本列将为空。

•CARDINALITY:根据cost-based方式操作所访问的行数的评估。

•BYTES:根据cost-based方式操作产生的字节的评估,。

•OTHER_TAG:其它列的内容说明。

•PARTITION_START:范围存取分区中的开始分区。

•PARTITION_STOP:范围存取分区中的停止分区。

•PARTITIONJD:计算PARTITION_START和PARTITION_STOP这对歹【J值

的步数.OTHER:其它信息即执行步骤细节,供用户参考。

•DISTRIBUTION:为了并行查询,存储用于从生产服务器到消费服务器分配列

的方法

•CPU_COST:根据cost-based方式CPU操作开销的评估。如果语句使用rule-

based方式,本列为空。

•IO_COST:根据cost-based方式I/O操作开销的评估。如果语句使用rule-

based方式,本列为空。

•TEMPSPACE:cost-based方式操作(sortorhash-join的临时空间占用评估。

如果语句使用rule-based方式,本列为空。

•ACCESS_PREDICATES:指明以便在存取结构中定位列,例如,在范围索弓I查

询中的开始或者结束位置。

•FILTER_PREDICATES:在生成数据之前即指明过滤列。

CONNECTBY操作产生DEPTH列替换LEVEL伪歹I」,有时被用于在SQL脚本

中帮助indentPLAN_TABLE数据

V$SQL_PLAN中的连接列

歹UADDRESS,HASH_VALUE和CHILD_NUMBER被用于连接V$SQL或

V$SQLAREA来获取cursor-specific信息,例如,BUFFER_GET,或连接V$SQLTEXT

获取完整的SQL语句。

ColumnViewJoinedColumn(s

ADDRESS,HASH_VALUEV$SQLAREAADDRESS,HASH_VALUE

ADDRESS,HASH_VALUE,CHILD_NUMBERV$SQL

ADDRESS,HASH_VALUE,CHILD_NUMBERADDRESS,HASH_VALUE

V$SQLTEXTADDRESS,HASH_VALUE

确认SQL语句的优化计划

下列语句显示一条指定SQL语句的执行计划。查看一条SQL语句的执行计

划是调整优化SQL语句的第一步。这条被查询到执行计划的SQL语句是通过语

句的HASH_VALUE和ADDRESS歹J识别。分两步执行:

1.SELECTsql_text,address,hash_valueFROMv$sql

WHEREsqLtextlike'%TAG%';

SQL_TEXTADDRESSHASH_VALUE

821577841224822469

2.SELECToperation,options,object_name,costFROMv$sql_plan

WHEREaddress='82157784'ANDhash_value=1224822469;

OPERATIONOPTIONSOBJECT_NAMECOST-----------------------------------------

SELECTSTATEMENT5SORT

AGGREGATE

HASHJOIN5

TABLEACCESSFULLDEPARTMENTS2TABLEACCESSFULL

EMPLOYEES2

学习动态性能表

第四篇-(1-V$SQLTEXT2007.5.29

本视图包括Sharedpool中SQL语句的完整文本,一条SQL语句可能分成多个

块被保存于多个记录内。

注:V$SQLAREA只包括头1000个字符。

V$SQLTEXT中的常用列

•HASH_VALUE:SQL语句的Hash值

•ADDRESS:sql语句在SGA中的地址

•SQL_TEXT:SQL文本。

•PIECE:SQL语句块的序号

V$SQLTEXT中的连接列

ColumnViewJoinedColumn(s

HASH_VALUE,ADDRESSV$SQL,V$SESSIONHASH_VALUE,ADDRESS

HASH_VALUE.ADDRESSV$SESSIONSQL_HASH_VALUE,SQL_ADDRESS

示例:已知hash_value:3111103299,查询sql语句:

select*fromv$sqltext

wherehash_value='3111103299,

orderbypiece

第四篇-(2-V$SQLAREA2007.5.29

本视图持续跟踪所有sharedpool中的共享cursor,在sharedpool中的每一条

SQL语句都对应一列。本视图在分析SQL语句资源使用方面非常重要。

V$SQLAREA中的信息列

•HASH_VALUE:SQL语句的Hash值。

•ADDRESS:SQL语句在SGA中的地址。

这两列被用于鉴别SQL语句,有时,两条不同的语句可能hash值相同。这时候,

必须连同ADDRESS一同使用来确认SQL语句。

•PARSING_USER_ID:为语句解析第一条CURSOR的用户

•VERSION_COUNT:语句cursor的数量

•KEPTVERSIONS:

•SHARABLE_MEMORY:cursor使用的共享内存总数

•PERSISTENT_MEMORY:cursor使用的常驻内存总数

•RUNTIME_MEMORY:cursor使用的运行时内存总数。

•SQL_TEXT:SQL语句的文本(最大只能保存该语句的前1000个字符。

•MODULE,ACTION:使用了DBMS_APPLICATION」NFO时session解析第一

条cursor时的信息

V$SQLAREA中的其它常用列

•SORTS:语句的排序数

•CPU_TIME:语句被解析和执行的CPU时间

•ELAPSED_TIME:语句被解析和执行的共用时间

•PARSE_CALLS:语句的解析调用嗽、硬次数

•EXECUTIONS:语句的执行次数

•INVALIDATIONS:语句的cursor失效次数

•LOADS:语句载入(载出数量

•ROWS_PROCESSED:语句返回的列总数

V$SQLAREA中的连接歹U

ColumnViewJoinedColumn(s

HASH_VALUE,ADDRESSV$SESSIONSQL_HASH_VALUE,

SQL_ADDRESS

HASH_VALUE,ADDRESSV$SQLTEXT,V$SQL,V$OPEN_CURSOR

HASH_VALUE,ADDRESSSQL_TEXTV$DB_OBJECT_CACHENAME

示例:

L查看消耗资源最多的SQL:

SELECThash_value,executions,buffer_gets,disk_reads,parse_callsFROM

V$SQLAREA

WHEREbuffer_gets>100000000Rdisk_reads>1000000

ORDERBYbuffer_gets+100*disk_readsDESC;

2.查看某条SQL语句的资源消耗:

SELECThash_value,buffer_gets,disk_reads,executions,parse_callsFROM

V$SQLAREA

WHEREhash_Value=228801498ANDaddress=hextoraw('CBD8E4B0,;

学习动态性能表

第五篇-V$SESSION2007.5.29

在本视图中,每一个连接到数据库实例中的session都拥有一条记录。包括用户

session及后台进程如DBWR,LGWR,arcchiver等等。

V$SESSION中的常用列

V$SESSION是基础信息视图,用于找寻用户SID或SADDR。不过,它也有一些

列会动态的变化,可用于检查用户。如例:

SQL_HASH_VALUE,SQL_ADDRESS:这两列用于鉴别默认被session执行的

SQL语句。如果为null或0,那就说明这个session没有执行任何SQL语句。

PREV_HASH_VALUE和PREV_ADDRESS两歹U用来鉴另U被session执行的上一条

语句。

注意:当使用SQL*Plus进行选择时,确认你重定义的列宽不小于11以便看到完

整的数值。

STATUS:这列用来判断session状态是:

•Achtive:正执行SQL语句(waitingfor/usingaresource

•Inactive:等待操作(即等待需要执行的SQL语句

•Killed:被标注为删除

下列各列提供session的信息,可被用于当一"或多个combination未知时找到

session。

Session信息

•SIDSESSION标识,常用于连接其它列

•SERIAL#:如果某个SID又被其它的session使用的话则此数值自增加(当一个

SESSION结束,另一个SESSION开始并使用了同一个SID。

•AUDSID:审查sessionID唯一性,确认它通常也用于当寻找并行查询模式

•USERNAME:当前session在oracle中的用户名。

Client信息

数据库session被一个运行在数据库服务器上或从中间服务器甚至桌面通过

SQL*Net连接到数据库的客户端进程启动,下列各列提供这个客户端的信息

•OSUSER:客户端操作系统用户名

•MACHINE:客户端执行的机器

•TERMINAL:客户端运行的终端

•PROCESS:客户端进程的ID

•PROGRAM:客户端执行的客户端程序

要显示用户所连接PC的TERMINALsOSUSER,需在该PC的

ORACLE.INI或Windows中设置关键字TERMINAL,USERNAME。

Application信息

调用DBMS_APPLICATION_INFO包以设置一些信息区分用户。这将显示下

列各列。

•CLIENTINFO:DBMS_APPLICATION_INFO中设置

•ACTION:DBMSAPPLICATION_INFO中设置

•MODULE:DBMS_APPLICATION_INFO中设置

下列V$SESSION列同样可能会被用到:

•ROW_WAIT_OBJ#

•ROW_WAIT_FILE#

•ROW_WAIT_BLOCK#

•ROW_WAIT_ROW#

V$SESSION中的连接列

ColumnViewJoinedColumn(s

SID

V$SESSION_WAIT„V$SESSTAT„V$LOCK,V$SESSION_EVENT,V$OPEN_CURS

ORSID

(SQL_HASH_VALUE,SQL_ADDRESSV$SQLTEXT,V$SQLAREA,V$SQL

(HASH_VALUE,ADDRESS

(PREV_HASH_VALUE,PREV_SQL_ADDRESSV$SQLTEXT,V$SQLAREA,

V$SQL(HASH_VALUE,ADDRESS

TADDRV$TRANSACTIONADDR

PADDRV$PROCESSADDR

示例:

1.查找你的session信息

SELECTSID,OSUSER,USERNAME,MACHINE,PROCESS

FROMV$SESSIONWHEREaudsid=userenv('SESSIONID";

2.当machine已知的情况下查找session

SELECTSID,OSUSER,USERNAME,MACHINE,TERMINAL

FROMV$SESSION

WHEREterminal='pts/tl'ANDmachine='rgmdbsl';

3.查找当前被某个指定session正在运行的sql语句。假设sessionlD为100

selectb.sql_text

fromv$sessiona,v$sqlareab

wherea.sql_hash_value=b.hash_valueanda.sid=100

寻找被指定session执行的SQL语句是一"1K公共需求,如果session是瓶颈的主

要原因,那根据其当前在执行的语句可以查看session在做些什么。

学习动态性能表

第六篇-(1-V$SESSION_WAIT2007.5.30

这是一个寻找性能瓶颈的关键视图。它提供了任何情况下session在数据库中

当前正在等待什么(如果session当前什么也没在做,则显示它最后的等待事件。当

系统存在性能问题时,本视图可以做为一个起点指明探寻问题的方向。

V$SESSION_WAIT中,每一个连接到实例的session都对应一条记录。

V$SESSION_WAIT中的常用列

•SID:session标识

•EVENT:session当前等待的事件,或者最后一次等待事件。

•WAIT_TIME:session等待事件的时间(单位,百分之一秒如果本列为0,说明

session当前session还未有任何等待。

•SEQ#:session等待事件将触发其值自增长

•Pl,P2,P3:等待事件中等待的详细资料

•P1TEXT,P2TEXT,P3TEXT:解释说明pl,p2,p3事件

附注:

1.State字段有四种含义:

(lWaiting:SESSION正等待这个事件。

(2Waitedunknowntime:由于设置了timed_statistics值为false,导致不能得到时

间信息。表示发生了等待,但时间很短。

(3Waitshorttime:表示发生了等待,但由于时间非常短不超过一个时间单位,所以

没有记录。

(4Waitedknnowtime:如果session等待然后得到了所需资源,那么将从waiting

进入本状态。

2.Wait_time值也有四种含义:

(1值>0:最后一次等待时间(单位:10ms,当前未在等待状态。

(2值=0:session正在等待当前的事件。

(3值=1:最后一次等待时间小于1个统计单位,当前未在等待状态。

(4值=2时间统计状态未置为可用,当前未在等待状态。

3.Wait_time和Second_in_wait字段值与state相关:

(1如果state值为Waiting,那么wait_time值无用。Second_in_wait值是实际的

等待时间(单位:秒。

(2如果state值为Waitunknowtime,那么wait_time值和Second_in_wait值者B无

用。

(3如果state值为Waitshorttime,那么wait_time值和Second_in_wait值都无

用。

(4如果state值为Waitingknowntime,那么wait_time值就是实际等待时间(单

位:秒,Second_in_wait值无用。

V$SESSION_WAIT中的连接列

ColumnViewJoinedColumn(s

SIDV$SESSIONSID

示例:

1.列出当前系统的等待事件

SELECTevent,

sum(decode(wait_time,0,1,0"Curr",

sum(decode(wait_time,0,0,1"Prev",

count(*"Total"

FROMv$session_waitGROUPBYeventORDERBYcount(*;

EVENTPrevCurrTot

PL/SQLlocktimerOil

SQL*NetmoredatafromclientOil

smontimerOil

pmontimerOil

SQL*Netmessagetoclient202

dbfilescatteredread202

rdbmsipcmessage077

Enqueue01212

pipeget01212

dbfilesequentialread31013

latchfree9615

SQL*Netmessagefromclient83513802215

这个按事件和wait_time的分组查询列出下列的信息:

•多数的session者R是空闲事件如:SQL*Netmessagefromclient,pipeget,PMON

timer等。•session的cpu占用可以通过上次session的非等待事件大致算出,除此问

题外:看起来多数session没有在等待什么事情(难道他们都在干活?但其最后等待

事件都是SQL*Netmessagefromcliento

2.列出指定ID的等待事件

select*fromv$session_waitwheresid=100;

3.应用pl,p2,p3进行等待事件的分析

v$session_wait视图的列代表的缓冲区忙等待事件如下:

P1—与等待相关的数据文件的全部文件数量。

P2-P1中的数据文件的块数量。

P3—描述等待产生原因的代码。

例:selectpl"File#",p2"Block#",p3"ReasonCode"

fromv$session_wait

whereevent='bufferbusywaits*;

如果以上查询的结果显示一个块在忙等待,以下的查询将显示这一块的名称和

类型:

selectowner,segment_name,segment_type

fromdba_extents

wherefile_id=&Pland&P2betweenblock_idandblock_id+blocks-1;

我们也可以查询dba_data_files以确定等待的文件的filename,方法

是使用v$session_wait中的Pl。

从v$session_wait中查询P3(原因编码的值可以知道session等待的原因。原

因编码的范围从。到300,下列为部分编码所代表的事项:

0块被读入缓冲区。

100我们想要NEW(创建一个块,但这一块当前被另一session读入。

110我们想将当前块设为共享,但这一块被另一session读入,所以我们必须等

待read(结束。

120我们想获得当前的块,但其他人已经将这一块读入缓冲区,所以我们只能等

待他人的读入结束。

130块被另一session读入,而且没有找到其它协调的块,所以我们必须等待读

的结束。缓冲区死锁后这种情况也有可能产生。所以必须读入块的CR。

200我们想新创建一个block,但其他人在使用,所以我们只好等待他人使用结

束。210Session想读入SCUR或XCUR中的块,如果块交换或者session处于非连

续的TX模式,所以等待可能需要很长的时间。

220在缓冲区查询一个块的当前版本,但有人以不合法的模式使用这一块,所以

我们只能等待。

230以CR/CRX方式获得一个块,但块中的更改开始并且没有结束。

231CR/CRX扫描找到当前块,但块中的更改开始并且没有结束。

第六篇-(2-V$SESSION_EVENT2007.5.30

本视图记录了每个session的每一项等待事件。由上文所知

V$SESSION_WAIT显示了session的当前等待事件,而V$SESSION_EVENT则记录

了session自启动起所有的事件。

V$SESSION_EVENT中的常用列

•SID:session标识

•EVENTsession等待的事件

•TOTAL_WAITS:此session当前事件的总等待数

•TIME_WAITED:此session总等待时间(单位,百分之一秒

•AVERAGE_WAIT:此session当前事件平均等待时间(单位,百分之一秒

•TOTAL_TIMEOUTS:等待超时次数

其它用法与V$SESSION_WAIT相似,不详述了

附注:Oracle的等待事件是衡量Oracle运行状况的重要依据及指标。等待事

件的概念是在Oracle中引入的,大致有100个等待事件。Oracle8.0中这个

数目增加到了大约150在个,在Oracle8i中大约有200个事件,在Oracle9i中大约

有360个等待事件。主要有两种类别的等待事件,即空闲(idle等待事件和非空闲

(non-idle等待事件。关于空闲事件和非空闲事件目前通过google可以搜索到非常

多详尽的相关信息,同时OracleDatabasePerformanceTuningGuideandReference

中关于WaitEvents也有非常详尽的描述,在此就不多费口舌了。不过我在itpub

论坛看到有热心人整理的chm格式非空闲事件说明,有兴趣的朋友可以下载,链

接如下:非空闲事件说明详见:http:〃/728733.html[三思笔记]学习

动态性能表

学习动态性能表第七篇--V$PROCESS2007.5.30本视图包含当前系统oracle运

行的所有进程信息。常被用于将oracle或服务进程的操作系统进程ID与数据库

session之间建立联系。在某些情况下非常有用:1.如果数据库瓶颈是系统资源

(如:cpu,内存,并且占用资源最多的用户总是停留在某几个服务进程,那么进行

如下诸项:2.3.4.找出资源进程找出它们的session,你必须将进程与会话

联系起来。找出为什么session占用了如此多的资源SQL跟踪文件名是基于服务

进程的操作系统进程ID。要找出session的跟踪文件,你必须将session与服务进

程联系起来。某些事件,如rdbmsipcreply,鉴别session进程的Oracle进程ID在

等什么。要发现这些进程在做什么,你必须找出它们的session。你所看到的服务

器上的后台进程(DBWR,LGWR,PMON等都是服务进程。要想知道他们在做什

么,你必须找到他们的session。V$PROCESS中的常用列ADDR:进程对象地

址PID:oracle进程IDSPID:操作系统进程IDV$PROCESS中的连接列

ColumnViewADDRV$SESSIONJoinedColumn(sPADDR示例:I.查找指定系统

用户在oracle中的session信息及进程id,假设操作系统用户为:junsansiselect

s.sid,s.SERIAL#,s.username,p.spidfromv$sessions,v$processpwheres.osuser=

'junsansi*ands.PADDR=p.ADDR2.查看锁和等待SELECT/*+rule*/Ipad(二

decode(l.xidusn,0,3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论