<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg>
讯享网
业务是否用最优的方式来运行。
如果不是最优的方式那就对SQL进行优化。
查看数据库的执行计划
导致性能问题的可能原因
1,表没有正确的创建索引---错误的执行计划
2,表没有及时的分析---错误的执行计划
3,热块---数据块的争用(反向索引?)
4,锁的阻塞---业务设计缺陷、
5,SQL解析消耗大量CPU---变量绑定
6,低效的SQL---SQL自身的问题
7,数据库整体负载过程---架构设计的问题
性能问题的定位
原则 尽可能从小范围分析问题
1,SQL层
如果能从定位到SQL,就不要从会话层面分析
已经定位到了某条SQL语句有问题,就针对该语句着手。使用工具 和 执行计划来分析该语句,如使用:10053,10046(查看某条语句资源消耗情况)
2,会话层
如果能定位到会话,就不要从系统层面分析:
VSESSTAT, VSQL, V\(LOCK SQL_TRACE</p> <p>3,系统层<br> 如果无法定位任何性能问题,从系统层面入手<br> AWR(STATSPACK), OS tools(top, iostat)</p> <p>锁<br> 没有并发就没有锁<br> Oracle中锁的分类:<br> Enqueues–队列类型的锁,通常和业务相关的 简写: enq<br> Latches—系统资源方面的锁,比如内存结构,SQL解析</p> <p>锁的原则:<br> 1,只有被修改时,行才会被锁定,select操作不会在数据表中加锁。<br> 2,当一条语句修改了一条记录,只有这条记录上被锁定,在Oracle数据库中不存在锁升级。<br> 3,当某行被修改时,它将阻塞别人对它的修改。<br> 4,当一个事务修改一行时,将在这个行上加上行锁(TX),用于阻止其它事务对相同行的修改。<br> 5,读永远不会阻止写。<br> 6,读不会阻塞写,但有唯一的一个例外,就是select … for update.<br> 7,写永远不会阻塞读<br> 8,当一行被修改后,Oracle通过回滚段提供给数据的一致性读。</p> <p>查看Oracle的锁的类型:<br> select type, name from v\)lock_type;
TM锁和TX锁:
TM表锁:发生在insert, update, delete以及select for update操作时,目的是保证操作能够正常进行,并且阻止其它人对表执行DDL操作。
TX锁 事务锁(行锁)对于正在修改的数据,阻止其它会话进行修改。
注1:TM锁所对应的 字段名:id1 返回的就是数据表的ID号,通过这个返回值可以查出被阻塞的表名,使用数据字典:dba_objects:
select object_name, from dba_objects where object_id =
注2:TX锁所对应的 字段名:id1 与 id2 之后就是对应着的回滚段的地址。
注3:request字段表示是否请求一个锁,值为0表示没有请求,非0说明有请求。
注4:BLOCK字段表示当前是不是有阻塞。值为0没有阻塞,非0表有阻塞。
查看当前会话的SID:
select distinct sid from v\(mystat;</p> <p>会话等待视图:vsession_wait where sid in (sid1, sid2);</p> <p>insert的阻塞与update的阻塞是不一样的。</p> <p>TM锁的几种模式---lock mode<br> Row Share(RS)—2<br> Row Exclusive Table Lock (RX) — 3<br> Share Table Lock—4<br> Share Row Exclusive Table Lock(SRX) —5<br> Exclusive Lock(X) — 6</p> <p>RI锁---基于引用关系的锁定<br> 当于具有主外键关系的表做DML操作时,锁定不单单发生在操作表上,相应的引用表上也可能加上相应的锁定。</p> <p>创建一个主表:<br> create table p(id int primary key);<br> 创建一个辅表:<br> create table c(id references p(id));</p> <p>在对主表进行insert操作的时候,从表也会被加表级锁。</p> <p>在对主表进行update,delete操作时,不会对从表加表级锁定。</p> <p>在对从表进行DML操作时,会对主表也会加表级锁。</p> <p>要在外键上创建一个索引,以提高数据处理效率。</p> <p>死锁<br> 两个会话互相持有对方资源,遇到死锁时,Oracle会自行对其进行处理。</p> <p>Latch的目的:<br> 1,保证资源的串行访问:<br> 保护SGA的资源方向<br> 保护内存的分配<br> 2,保证执行的串行化:<br> 保护关键资源的串行执行<br> 防止内存结构损坏</p> <p>Latch不是队列性的。是数据库的资源层。<br> Lock是发生的数据库的业务层。</p> <p>Latch在SGA中。<br> 资源的请求和分配:<br> 共享池<br> sql解析,sql重用<br> 数据缓冲池<br> 数据访问,数据写入磁盘,数据读入内存<br> 修改数据块<br> 数据段扩展</p> <p>查看数据库中的Latch,使用的视图:v\)latchname
Latch持有的时间非常短

Latch的获取:
1,wait 方式--如期无法获取请求的Latch,则:
spin: 当一个会话无法获得需要的latch时,会继续使用CPU(CPU空转),达到一个间隔后,再次尝试申请latch,直到达到最大的重试次数。
sleep: 当一个会话无法获得需要的latch时,会等一段时间(sleep),达到一个间隔后,再次尝试申请latch,如此反复,直到达到最大的重试次数。
2,No wait方式--如果沅法获取请求的latch,则:
不会发生sleep或者spin
转而去获取其它可用的latch
shared pool里的latch争用--绑定变量
用于标识trace文件标识:
alter session set tracefile_identifier=bind;
对执行的SQL语句做trace记录
alter session set sql_trace = true;
Buffer cache的机制
视图:v\(bh<br> 用于查看文件头。<br> NXT_HAST, PRV_HASH</p> <p>Latch相关视图—V\)LATCH
这个视图实际上是oracle对每个latch的统计信息的一个汇总,每一条记录表示一种latch.
select name, gets, misses, sleeps, immediate_gets, immediate_misses from v\(latch where name like ‘cache%’;</p> <p>注:NAME:latch名称<br> GETS:以Willing to wait请求模式latch的请求成功数<br> MISSES: 初次尝试请求不成功次数<br> SLEEPS:成功获取前sleeping次数<br> IMMEDIATE_GETS: 以Immediate模式latch请求数<br> IMMEDIATE_MISSES:以IMMEDIATE模式请求失败数</p> <p>V\)LATCHHOLDER
该视图用于显示当前的latch holders
PID 标明当前的哪个进程占用着latch
SID 标明当前哪个会话使用着latch
LADDR 标明latch地址
NAME 用于指定被占用的LATCH名
GETS 标明当前的LATCH被获取的次数
V

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/186005.html