知识大全 OracleFreelist和HWM原理及性能优化
Posted 空间
篇首语:树高千尺有根,水流万里有源。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 OracleFreelist和HWM原理及性能优化相关的知识,希望对你有一定的参考价值。
OracleFreelist和HWM原理及性能优化 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
近期来 FreeList的重要作用逐渐为Oracle DBA所认识 网上也出现一些相关的讨论 本文以FreeList为线索对Oracle的存储管理的原理进行较深入的探讨 涉及Oracle段区块管理的原理 FreeList算法等 而与FreeList密切相关的一个重用特性HWM 与sql性能密切相关 本文也作了原理分析介绍 在原理探讨的基础上 介绍了常用的存储参数分析方法 并对所涉及的存储优化 HWM的优化和Freelist竞争优化作了说明缩略语 ASSM auto segement space management HWM high water mark DBA data block address OLTP online transaction process OPS oracle parallel server
简介 Oracle的空间管理和存储参数管理是Oracle管理及优化的重要部分 FreeList作为Oracle底层存储参数中的核心参数 其行为方式对Oracle的存储管理及性能优化有重大影响 而现有的Oracle文档对此方面的内容比较缺乏 虽然Oracle i已出现了ASSM 但是作为深入调优对FreeList认识仍是必要的
近期来 FreeList的重要作用逐渐为Oracle DBA所认识 网上也出现一些相关的讨论 本文以FreeList为线索对Oracle的存储管理的原理进行较深入的探讨 涉及Oracle段区块管理的原理 FreeList算法等 而与FreeList密切相关的一个重用特性HWM 与sql性能密切相关 本文也作了原理分析介绍 在原理探讨的基础上 介绍了常用的存储参数分析方法 并对所涉及的存储优化 HWM的优化和Freelist竞争优化作了说明
这些原理分析和性能优化都建立在探讨的基础上 限于篇幅和本人经验可能存在局限 偏差或谬误
为了准确文中部分结构和字段的说明直接用英文描述 限于篇幅本文不对同样很重要的block结构作更深入的讨论 对OPS性能有重要影响的free list group本文也未提及 因此本文在单一free list group下讨论 对于block的深入讨论 free list group的介绍与优化以及PCTUSED和PCTFREE等重要参数的优化请参见参考文献和资料
原理探讨
FreeList作为一个Oracle存储管理的核心参数 其行为方式由Oralce内部控制 我们一般不需要掌握和控制 但是我们可能会遇到这些问题 当插入一条记录 会插入到那个块中?是使用新块 还是插入有数据的老块?段是什么时候扩展的 如何扩展的?表中只有一条记录 但是作一次select时代价却是上千个块 为什么?如果我们从原理上清楚了Oracle的存储管理方式 对相关这些问题的解决及性能优化就清晰自然了
Oracle的逻辑储存结构
Oralce的逻辑存储结构按表空间 段 区 块进行管理 块是Oracle用来管理存储空间的最基本单元 Oracle数据库在进行输入输出操作时 都是以块为单位进行逻辑读写操作的 区由一系列连续的块组成 Oralce在进行空间分配 回收和管理时是以区为基本单位的 段由多个区组成 这些区可以是连续的也可以是不连续的 一般情况下一个对象拥有一个段 表空间中容纳段和区
在生成段的时候 会同时分配初始区(initial extents) 初始区的第一个块就格式化为segment header 并被用来记录free list描述信息 extents信息 HWM信息等
free list概念
free list是一种单向链表用于定位可以接收数据的块 在字典管理方式的表空间中 Oracle使用free list来管理未分配的存储块 Oracle记录了有空闲空间的块用于insert或Update 空闲空间来源于两种方式 段中所有超过HWM的块 这些块已经分配给段了 但是还未被使用 段中所有在HWM下的且链入了free list的块 可以被重用 free list具有下列属性
l flag指示free list 被使用( )或未使用( ) l free list 链的首块的地址DBA(data block address) l free list 链的尾块的地址DBA free list 的信息通常保留在segment header中 这里给出segment header block dump片段加以说明 nfl = nfb = typ = nxf = SEG LST:: flg: UNUSED lhd: x ltl: x SEG LST:: flg: USED lhd: x c ltl: x c SEG LST:: flg: USED lhd: x c ltl: x c SEG LST:: flg: UNUSED lhd: x ltl: x
Segment Header: ==> nfl: number of free lists/block ==> nfb: number of free list blocks + segment header ==> typ: block type ==> nxf: number of transaction free lists Segment List: ==> flg: flag USED or UNUSED the free list ==> lhd: head of free list ==> ltl: tail of free list
在每一个块中都有一个标记flg用来表明块是否链入了 free list链中 如果这个标志置上 该块中后向指针指向free list链中下一个块的DBA 如果当前块是链的最末尾的块 该后向指针值为 这里给出位于free list上的block dump的片段
Block header dump: x c Object id on Block? Y seg/obj: xe d csc: x c itc: flg: O typ: DATA fsl: fnx: x c ver: x
==> Seg/obj Object ID in dictionary ==> csc SCN of last block cleanout ==> itc Number of ITL slots ==> flg O = On freelist = Not on freelist ==> typ = DATA = INDEX ==> fsl ITL TX freelist slot ==> fnx DBA of NEXT block on freelist
举例来说如果有五个块在free list中 分别为A B C D E 就会形成segment header >A >B >C >D >E | 同时segment header >E
free list类别
在段中存在 类free list 即Master Freelists (MFL) Process Freelists (PrFL) 和 Transaction Freelists
Master Free List(公用空闲空间池):
每一个段中有一个Master free list 在段创建的时候自动生成 对于每一个段来说都有这样一个空闲空间池 对每个进程都是公用的 空闲空间就是位于master free list 的块上 由于Master free list是公用的 因此当多个进程同时插入行到同一个段上 master free list竞争使用程度就会增加
Process Free Lists
为了减少Master Free list的竞争问题 引入了另一种free list叫做Process free lists 根据sql命令 CREATE/ALTER 中的参数FREELISTS 创建 这样多个free list 就可以分摊空闲空间的管理 以提高OLTP应用作高度并发插入和更新事务时空间分配管理的性能 通过指定CREATE TABLE / CLUSTER or INDEX的子句STORAGE的参数FREELISTS 来创建 例如: CREATE TABLE flg ( ) STORAGE ( FREELISTS ) 缺省的FREELISTS为 此时不会创建Process free lists 当FREELISTS>= 时 创建Process free lists 进程在使用process free list是根据进程的Oracle PID (Process ID)来选择的 公式如下: select list entry = (PID % NFL) + NFL : FREELISTS定义的Process free list个数 Transaction Free Lists 当Oracle需要时动态创建 一个Transaction Free List 是一种专门给某一个事务使用的free list 每个段至少有 个transactions free lists 并且这个值在需要时会增长 直到达到Segment Header块的大小限制 一个事务只有下面情况下会需要分配一个Tx Free Lists entry: 块中释放空间时(DELETE or UPDATE) 并且还不存在Tx Free Lists entry时
Free list行为
Freelist Link and Unlink 操作
Freelist 按后进先出队列(LIFO) 方式管理 也就是说最后被link到freelist的块拥有最先unlink的机会 当块中空闲空间增加到大于PCTFREE时 块放入freelist中 free list中的块可用来作update 或insert 当块中没有足够的空间用于insert操作时并且使用空间大于PCTUSED 块就会从free list中移出
在块在DELETE or UPDATE 操作之后 如果使用空间落到PCTUSED下 块再次link到free list中 每次块加入free list时 都是link到链表的头部
例如 考虑段中有 个块编号由 到 其中有 个块在free list上并假设HWM是 (block实际使用DBA编号) > > > > > |
现在作INSERT 操作 需要 bytes空间 假设块 上空间不足 但块 上空间可用 现在数据插入到块 现在块 的剩余空间小于该表的PCTUSED 因此块 从free list链表中移出 PCTFREE and PCTUSED参数的目的就是用来控制数据块从free list的链表中移入/移出行为的 现在free lists象这样 > > > > | 然后在同一事务中作DELETE同一个段的数据 使块 和 落到PCTUSED下 现在这些块加入到free list链中 free list链现在象这样: > > > > > > |
Transaction Free List 算法
扫描segment Header块中所有的Tx free list 检查是否还没有Tx free list entry分配给transaction 如何没有 将寻找未使用的entry或已经提交了事务的空的Tx free list 如果上述搜索过程失败 新的entry会在segment Header块中Tx free lists区域中开辟 如果没有空间来生成 事务就必须等待entry的释放
segment header中的最大free list个数: Block Size Max # Freelists K K K k 事务T 释放出来的空闲块(DELETE or UPDATE)的使用 : l 立即被T 所重用 l 当T mit后被其它需要空闲块的事务重用 过程举例如下:
HMW概念
HIGH WATER MARK代表一个表使用的最大的(top limit)块 中已经提到HIGH WATER MARK 记录在segment header中 并且在Oracle插入数据时一般增长 个blocks(并非总是 个块 具体参见 中流程图中HMW增长方式) segment header block中与HWM相关信息说明如下: EXTENT CONTROL: Extent Header:: spare : space : #extents: #blocks: last map x #maps: offset: Highwater:: x d ext#: blk#: ext size: #blocks in seg hdr s freelists: #blocks below: mapblk x offset: Unlocked ==> spare : this field is no longer used (old inc# now always ) ==> space : this field is no longer used (old ts# now always ) ==> #extents: number of extents allocated to segment ==> #blocks: number of blocks allocated to segment
==> last map: address of last extent map block if extent map is entirely in the segment header ==> #maps: number of extent map block ==> offset: offset to end of extent map
==> HWM dba: address of block at highwater mark ==> ext#: HWM extent number relative to segment ==> blk#: HWM block number within extent ==> ext size: HWM extent size (in blocks) ==> #blocks in seg hdr s freelists: number of blocks in seg hdr s free list ==> #blocks below: number of blocks below HWM ==> mapblk dba: dba of extent map block containing HWM extent is if HWM is in the segment header ==> offset: offset within extent map block is the ext# if HWM is in segment header ==> Locked by: if locked by a transaction the xid is displayed
HWM可以说是已经使用过的存储空间和未使用过的存储空间之间的分界线 在表使用过程中 HWM一直向一个方向移动 插入记录时HWM可能会向增加的方向移动 但是删除记录时HWM并不会向相反的方向移动 参见 下图显示了某个数据段中HWM的位置情况
HIGH WATER MARK之所以重要是因为它对全表扫描性能的影响 当实施一个全表扫描时 Oracle会读取所有HIGH WATER MARK下的块即使它们是空块 当HIGH WATER MARK 下有很多unused block时实施全表扫描会增加额外的不必要的I/O 它也会在全局共享区中填充很多很多空块
分析方法
存储参数基本上属于oracle internal的东西 因此oralce并没有提供很好的手段来分析 但是对于DBA来说 还是可以通过block dump和DBMS_SPACE等手段来获取部分信息
提取block和free list信息
创建dbms_space使用的存储过程show_space
相关参考
我一直是使用mysql这个数据库软件它工作比较稳定效率也很高在遇到严重性能问题时一般都有这么几种可能 索引没有建好 &n
rowinset(sec) 注意keyrows和Extra这三项这条语句返回的结果说明了该sql会使用PRIMARY主键索引来查询
这时mysql用到了clicks索引进行查询但是结果集比userid还要大!看来还要再进行限制 mysql>descsele
PGA自动管理原理深入分析及性能调整 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! PG
这时可以看到结果集还是条但是Extra中的filesort不见了这时mysql使用userid_clicks这个索引去查询这不但能快速查询到userid=admin
机器实在负荷不了 如果做了以上调整服务器还是不能承受那就只能通过架构级调整来优化了 mysql同
嗯这时可以看到mysql使用了userid这个索引搜索了用userid索引一次搜索后结果集有条然后虽然使用了filesort一条一条排序但是因为结果集只有区区条效率
oracle的高水位线(HWM) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 由之前的面试题一
Oracle性能调优思路 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 问oracle进程内存占
ORACLE性能调优原则下篇 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 用户SQL质量