2.3 诊断FREE LIST竞争 6

2.3.1 概念 6

2.3.2 是否存在free list争用 6

2.3.3 确定free list 争用的段 7

2.3.4 优化free list争用 7

2.4 诊断LOCK竞争 8

2.4.1 概念 8

2.4.2 可能引起lock contention的原因 8

2.4.3 锁解决办法 9

2.4.4 死锁 9

2 调整争用

争用:每当一个Oracle 进程试图访问一个Oracle结构,但由于该结构正由另一个进程结构使用而未能成功访问到它时,就发生对Oracle资源的争用。常见的有latch、Free List 、lock争用。

主要维护的争用有:

 Latch(锁存器):可作为内存性能的指标,说明内存需要调整。

 Free List:会导致繁忙表上的DML操作性能很差。

 Lock:会遇到彻底的暂停,产生巨大的性能影响。

2.1优化维护

维护时,主要通过检查,判断存在的latch和free list争用是否合理,不合理,则启动相应的优化工作。

而lock,在遇到问题的时候,可作为维护参考,平时不进行太多的维护(或从应用上考虑优化)。(除了定期去$ORACLE_HOME/admin/$ORACLE_SID/udump查看死锁情况外)

2.2诊断latch竞争

2.2.1概念

Latch是简单的、低层次的序列化技术,用以保护SGA中的共享数据结构,比如并发用户列表和buffer cache里的blocks信息。一个服务器进程或后台进程在开始操作或寻找一个共享数据结构之前必须获得对应的latch,在完成以后释放latch。不必对latch本身进行优化,如果latch存在竞争,表明SGA的一部分正在经历不正常的资源使用。

1)Latch的作用:

A、序列化访问:保护SGA中的共享数据结构;保护共享内存的分配。

B、序列化执行:避免同时执行某些关键代码;避免互相干扰。

2)Latch请求的两种类型:

A、willing-to-wait:请求的进程经过短时间的等待后再次发出请求,直到获得latch

B、immediate:如果没有获得latch,请求的进程不等待,而是继续处理其他指令。

2.2.2是否存在latch争用

select event,total_waits,time_waited

from v$system_event

where event = ‘latch free’;

如:

EVENT TOTAL_WAITS TIME_WAITED

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

latch free 4320663 779167

自实例启动以来,发生过4320663个latch争用,等候这些latch所 花费的时间为779167毫秒。

2.2.3 检查Latch是否主要竞争

检查latch free是不是主要的wait event:

Select event,total_waits,time_waited from v$system_event order by time_waited desc;

2.2.4 DBA关注的latch内容

DBA需要关注的latch有:

Select name,gets,misses,sleeps,wait_time,spin_gets,immediate_gets,immediate_misses from v$latch

where name like ‘%shared pool%’

or name like ‘%library cache’

or name like ‘%cache buffers lru chain%’

or name like ‘%cache buffers chains%’

or name like ‘%redo allocation%’

or name like ‘%redo copy%’;

与willing-to-wait请求有关的列:

Select name,gets,misses,sleeps,wait_time,spin_gets from v$latch;

与immediate请求有关的列:

Select name,immediate_gets,immediate_misses from v$latch

Gets: number of successful willing-to-wait requests for a latch;

Misses: number of times an initial wiling-to-wait request was unsuccessful;

Sleeps: number of times a process waited after an initial willing-to-wait request;

Wait_time: number of milliseconds waited after willing-to-wait request;

Spin_gets: gets that misses first try but succeed after spinning.

Immediate_gets: number of successful immediate requests for each latch;

Immediate_misss: number of unsuccessful immediate requests for each latch;

 shared pool:需要优化shared pool。(在没有配置large pool情况下使用shared server选件,会导致很高的shared pool latch.)

 library cache:需要优化library cache。

 cache buffers LRU chain:管理database cache buffers上的LRU List上的块,自由缓冲区列表。此争用有两种可能:

- 导致严重的全部扫描的SQL语句或执行计划。SQL需要优化。

- 脏缓冲区写盘database writer未能跟上I/O请求。优化磁盘I/O。

 cache buffers chains:预示某些某些缓冲块被重复搜索,块大小比较大的比块大小小的更容易遇见此latch。优化块大小与I/O关系。

 redo allocation:许多用户同时放入redo log buffer,则产生该latch。优化redo log buffer。

 redo copy:用户server process复制信息到redo log buffer时发生。优化redo log buffer。

一般无需调整latch(实际上在9i中,init.ora已经废弃了所有的latch调整参数),但是下列的措施是有用的(根据v$latch作为调整其他性能指标的指示器,而不是调整latch本身):

A、对处于竞争中的latch做进一步的调查

B、如果竞争主要存在于shared pool和library cache中,可以考虑调整应用

C、如果进一步的调查显示需要调整shared pool和buffer cache,就进行调整

2.3诊断free list竞争

(使用management local的表空间不用调整,对表的insert和delete,update操作有重要指导意义)

判断表空间是否management local:

select tablespace_name,contents,extent_management,allocation_type,segment_space_management

from dba_tablespaces;

2.3.1概念

每个段保持一个free list来包含这个段中能接受新行的块。

比如如果应用程序有许多频繁插入行的用户,在试图访问该表的free list就可能会经历等待。

2.3.2是否存在free list争用

select event,total_waits,time_waited from v$system_event

where event = ‘buffer busy waits’;

自数据库启动来,可能发生的free list 争用。

还应经过以下查询确定:

select class,count,time from v$waitstat

where class in

(‘free list’,’segment header’);

count:访问一个块的等待次数。

Time:等待访问块所花费的总时间。

例:

CLASS COUNT TIME

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

segment header 1869 1725

free list 0 0

说明:针对段头部的free list相关等待发生了1896次,针对自由列表发生的free list为0次。

2.3.3确定free list 争用的段

select s.segment_name,s.segment_type,s.freelists

from dba_segments s,v$session_wait w

where w.p1 = s.header_file

and w.p2 = s.header_block

and w.event = 'buffer busy waits';

(确定当前的争用)

2.3.4优化free list争用

1) 增加附加的free list

默认创建只有一个free list,若要增加更多的free list,可以使用

alter table hr.employee storage (freelists 5);

进行修改。

2) 把段转移到自动段管理表空间上(Oracle 9i新特性)

management local

使用自动段管理表空间,将不再利用free list管理块,而是利用表空间数据文件头的位图来管理表空间中每个段的自由块分配(包括新建的任何附加段),此时该段在dba_segments视图中的freelists的值将是NULL空值。

(create一个management local的表空间,使用

alter table hr.employee move tablespace app1_data;

的方法把表从一个表空间移动到另外一个management local的表空间)

(表里有long字段,得用其他方法移动)

2.4诊断lock竞争

2.4.1概念

lock 用来保护对数据的访问的一致性,latch用来保护对内存的访问(latch从不在process之间共享)。

Lock通常发生在许多用户正在少量的表上执行DML操作的时候发生。一旦lock申请获得,lock会一直保留给该用户,直到lock的用户发布一条commit或rollback为止。

使用Oracle默认加锁机制,可以:

1) 修改同一个表的不同行,不用担心锁问题。

2) 修改同一个表的同一行,由等待队列根据system change number(SCN)决定谁的修改结果是最终修改结果。(默认队列最多数从init.ora的session获得,也可修改enqueue_resources手工调整)

如果需要严格的锁机制,可把init.ora的row_locking从always(row lock)修改为intent的(table lock)。

一共有两类锁“DML数据锁(Data lock)”和“DDL目录锁(Dictionary lock)”,有两种模式使用锁:“独占型(Exclusive lock)”和“共享型(Share lock)”模式,实现数据的并发性和一致性。

v$lock:报告锁模式等情况。

v$locked_object:报告被锁的对象信息。

dba_waiters:报告阻塞的具体情况,有锁模式,wait session和hold session。

dba_blockers:报告霸占资源导致别的session阻塞的sid.(如果没有,则执行$ORALCE_HOME/rdbms/admin/catblock.sql和utllockt.sql脚本创建)

DML事务使用row-level locks,查询不会锁定数据。锁有两种模式:exlusive、share。

锁的类型:

• DML or data locks:

– Table-level locks(TM的数量一般有init.ora的transactions获,但可修改dml_locks做调整)

– Row-level locks(TX)

• DDL or dictionary locks

一个transaction至少获得两个锁:一个共享的表锁,一个专有的行锁。Oracle server将所有的锁维护在一个队列里,队列跟踪了等待锁的用户、申请锁的类型以及用户的顺序信息。

Lock在下列情况会释放:commit;rollback;terminated(此时由pmon清理locks)。

Quiesced database:一个数据库如果除了sys和system之外没有其他活动session,这个数据库即处于quiesced状态。活动session是指这个session当前处于一个transaction中,或一个查询中,一个fetch中,或正占有某种共享资源。

2.4.2可能引起lock contention的原因

不必要的高层次的锁;

长时间运行的transaction;

未提交的修改;

其他产品施加的高层次的锁。

2.4.3锁解决办法

如果出现了阻塞,则可通过下列方法之一解决这种争用:

1) 修改应用程序,使之不要使用严格的锁和不要有太长的事务(可设逻辑提交点)。(更不要使用显示锁select .. for update,lock table .. in exclusive mode;)

2) 查出锁住对象,制造阻塞的session,通知用户commit或rollback。

可使用profile的方式,声明断开已空闲一段时间的用户。

3) 使用alter system kill session ‘sid,$serial’等方法杀死引起阻塞的session(如果该session没有在活动不会收到被kill的信息,直到发出新操作才得到kill提示)。

2.4.4死锁

Oracle自动检测和解决死锁,方法是通过回滚引起死锁的语句(statement),但是这条语句对应的transaction并没有回滚,因此当收到死锁的错误信息后,应该去回滚改transaction的剩余部分。

发生死锁后,会自动在$ORACLE_BASE/admin/$ORACLE_SID/udump目录下生成一个详细描述死锁的跟踪文件。

(Oracle会有租塞,但不会有死锁,因发生死锁后,导致发生死锁的操作会取消并报告“ORA-00060: 等待资源时检测到死锁”错误,但可能会继续出现阻塞(因无人commit或rollback)。)

oracle9i阻塞,Oracle 9i 整体性能优化概述(zt)相关推荐

  1. oracle 优化 io占用,oracle 整体性能优化概述之五:调整磁盘io

    5 调整磁盘I/O 5.1 数据文件I/O调整 5.1.1 测量数据文件IO 5.1.2 改进数据文件I/O 5.2 DBW0 5.2.1 测量DBW0性能 5.2.2 改进DBW0性能 5.3 单个 ...

  2. Oracle 数据库的性能优化

    oracle数据库的性能优化 对于ORACLE数据库的数据存取,主要有四个不同的调整级别,第一级调整是操作系统级包括硬件平台,第二级调整是ORACLE RDBMS级的调整,第三级是数据库设计级的调整, ...

  3. Oracle 数据库表性能优化

    Oracle 数据库表性能优化 最近在一次工作过程中,遇到了oralce 表性能慢的问题.一个历史表,一个月将近1000多万的数据量,想查询这个表的数据,只使用了一个简单的语句,却一个多小时都查不出来 ...

  4. Oracle性能优化概述

    Oracle优化概述 1.谁应该进行优化? 与oracle数据库相关的任何人,包括体系结构设计者,应用程序设计者, 应用程序开发者,数据库管理员,系统管理员都应该顾及性能和优化. 2.为什么要优化 数 ...

  5. Oracle数据库访问性能优化

    一.百万级数据库优化方案 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断 ...

  6. oracle临时表经常被锁_5.性能测试 - Oracle体系结构和性能优化简介

    体系结构 Oracle体系结构示意图 Oracle服务器: Oracle服务器是一个数据库管理系统,它为信息管理提供了开放.综合和集成的方法,包括Oracle实例和 Oracle数据库. Oracle ...

  7. oracle awr报告生成_5.性能测试 - Oracle体系结构和性能优化简介

    体系结构 Oracle体系结构示意图 Oracle服务器: Oracle服务器是一个数据库管理系统,它为信息管理提供了开放.综合和集成的方法,包括Oracle实例和 Oracle数据库. Oracle ...

  8. ORACLE学习笔记--性能优化3

    9.怎么避免使用特定索引 在很多时候,Oracle会错误的使用索引而导致效率的明显下降,我们可以使用一点点技巧而避免使用不该使用的索引,如: 表test,有字段a,b,c,d,在a,b,c上建立联合索 ...

  9. Oracle的SQL性能优化

    ORACLE SQL性能优化注意事项: select  distinct 列, ...  from tab 1 jon tab2 on ()  where  ... group by ... havi ...

  10. ORACLE WITH与性能优化

    with as能够做到更好性能的原理是把一段查询sql先执行,把获取的数据放入temp表. with as性能优化主要有两方面: 一方面,当一个with as定义的表名被调用两次以上时,oracle优 ...

最新文章

  1. linux root权限_深入了解 Linux 权限
  2. ASP.NET jQuery 随笔 在TextBox里面阻止复制、剪切和粘贴事件
  3. 用python计算两个二维list依据第二维的前一个数据相加
  4. 首席技术执行官_如何在几分钟内找到任何首席执行官的电子邮件地址
  5. java number string_java基础系列(一):Number,Character和String类及操作
  6. redis——sentinel
  7. 块级元素的margin-left和margin-right的用法注意
  8. .NET Framework 2.0新增特性总结
  9. 动态PHP查看新闻,PHP_用文本文件实现的动态实时发布新闻的程序,动态实时发布新闻的程序,可 - phpStudy...
  10. 数据库备份恢复策略_如何根据备份策略选择和检查正确的数据库恢复模型
  11. 私有静态方法private static method-值得用吗?
  12. 实战案例:场景测试之ATM机取款业务测试
  13. 配置sqlplus的AUTOTRACE
  14. 远程服务异常处理的实践之一:客户端
  15. Helm 3 完整教程(三):chart 的文件结构和字段详解
  16. multisim页面不够大_微信订阅号页面改版,iOS 14.2存在严重耗电问题,贾跃亭再成被执行人,特斯拉回应被判欺诈,这就是今天的其他大新闻!...
  17. GoogleMaterialDesign900个实用的Axure图标组件库
  18. 20170216.双目摄像机标定参数说明
  19. 什么是 PaaS?“平台即服务“ 简介
  20. 解决win10 phptoshop #fff纯白不是这样的白 显示器高级的问题

热门文章

  1. win10同时安装jdk8和jdk11带来的小坑
  2. JavaScript篇 深入理解JavaScript函数
  3. 处理网页上的字符溢出的方法
  4. Python学习心得--变量类型篇
  5. 平衡的阵容——洛谷——2880——RMQ
  6. jq中获取属性名的方法
  7. HTML5 - 搭建移动Web应用
  8. Prototype.js 1.4中文使用手册PDF版下载
  9. MyBatis中foreach的用法
  10. SpringBoot项目进行单元测试